用信号通知线程停止

本文关键字:线程 通知 信号 | 更新日期: 2023-09-27 18:25:09

有这样的代码。

启动线程:

Thread[] thr;
static object locker = new object();
bool liking = true;
private void button2_Click(object sender, EventArgs e)
{
    button2.Enabled = false;
    button3.Enabled = true;
    string post = create_note();
    decimal value = Program.Data.numericUpDown1;
    int i = 0;
    int j = (int)(value);
    thr = new Thread[j];
    for (; i < j; i++)
    {
        thr[i] = new Thread(() => invite(post)); 
        thr[i].IsBackground = true;
        thr[i].Start();
    }
}
public void invite(string post)
{
    while (liking)
    {
        if (//some comdition)
            exit all threads, and start string post = create_note(); again
    }
}

如果invite(string post)中的某个条件成立,我需要停止所有线程,然后再次转到string post = create_note();,获取字符串post并再次启动线程。

怎么做?

用信号通知线程停止

不用手动线程管理,而是将Parallel.ForCancellationToken:一起使用

        var cts = new CancellationTokenSource();
        var options = new ParallelOptions 
        { 
            CancellationToken = cts.Token,
            MaxDegreeOfParallelism = System.Environment.ProcessorCount
        };
        var result = Parallel.For(0, j, options, i =>
        {
            invite(post);
            options.CancellationToken.ThrowIfCancellationRequested();
        });

当您想取消并行计算时,只需从外部代码中调用cts.Cancel()即可。

您可以使用锁并创建一个类来管理您的线程,如下所示:

public class SyncClass
{
    public Thread[] thr;
    private int NumberOfWorkingThreads { get; set; }
    private object Sync = new object();
    public int ThreadNumber { get; private set; }
    public event EventHandler TasksFinished;
    public SyncClass(int threadNumber)
    {
        thr = new Thread[threadNumber];
        ThreadNumber = threadNumber;
        NumberOfWorkingThreads = ThreadNumber;
        //LunchThreads(threadNumber);
    }
    protected void OnTasksFinished()
    {
        if (TasksFinished == null)
            return;
        lock (Sync)
        {
            NumberOfWorkingThreads--;
            if (NumberOfWorkingThreads == 0)
                TasksFinished(this, new EventArgs());
        }
    }
    public void LunchThreads()
    {
        string post = create_note();
        for (int i = 0; i < ThreadNumber; i++)
        {
            thr[i] = new Thread(() => invite(post));
            thr[i].IsBackground = true;                
            thr[i].Start();
        }
    }
    private void invite(string post)
    {
        while (true)
        {
            if (true)
            {
                break;
            }
        }
        OnTasksFinished();
    }

}

使用该事件通知所有线程的结束,然后类将像这样使用:

    private void Operation()
    {
        var sync = new SyncClass(10);
        sync.TasksFinished += sync_TasksFinished;
        sync.LunchThreads();
    }

     void sync_TasksFinished(object sender, EventArgs e)
    {
        Operation();
    }