信令线程停止

时间:2013-07-28 10:34:51

标签: c#

有这样的代码。

启动主题:

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();,获取字符串帖子并再次启动线程。

怎么做?

2 个答案:

答案 0 :(得分:3)

使用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()

答案 1 :(得分:0)

你可以使用lock并创建一个管理你的线程的类:

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();
    }