如何使所有线程等待一个

时间:2013-07-26 09:39:24

标签: c# multithreading

我需要启动一个线程,它将200个不同的线程发送一个字符串(url)然后启动它们。然后第一个线程停止。当此url返回404错误时,所有线程必须停止,并且第一个线程需要启动。我该如何组织它?感谢。

抱歉我的英文。我希望你理解我)

我如何启动线程:

Thread[] thr;
int good_delete;
static object locker = new object();
private void button1_Click(object sender, EventArgs e)
{
    button1.Enabled = false;
    button2.Enabled = true;
    decimal value = numericUpDown1.Value;
    int i = 0;
    int j = (int)(value);
    thr = new Thread[j];
    for (; i < j; i++)
    {
        thr[i] = new Thread(new ThreadStart(go));
        thr[i].IsBackground = true;
        thr[i].Start();
    }
}

2 个答案:

答案 0 :(得分:1)

您应该使用WaitHandle.WaitAll方法。有关详细信息,请查看this reference

编辑您的代码可能如下所示:

int j = (int)(value);
thr = new Thread[j];
ManualResetEvent[] manualEvents = new ManualResetEvent[j];
for (int i = 0; i < j; i++)
{
    manualEvents[i] = new ManualResetEvent(false);
    ThreadPool.QueueUserWorkItem(new WaitCallback(go), manualEvents[i]);
}
WaitHandle.WaitAll(manualEvents);

之后,您应该使用go方法设置事件:

private void go(object state)
{
    //put your code here
    ((ManualResetEvent)state).Set();
}

另请注意,传递给WaitHandle方法的WaitAll个对象的最大数量为64,因此您必须手动拆分源。

祝你好运!

答案 1 :(得分:0)

任何实现目标的方法都应该使用线程对象的Join方法

  for (; i < j; i++)
  {
    thr[i] = new Thread(new ThreadStart(go));
    thr[i].IsBackground = true;
    thr[i].Start();
  }

  for (; i < j; i++)
  {
    thr[i].Join();
  }