-3

我需要启动一个线程,该线程向 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();
    }
}
4

2 回答 2

1

您应该WaitHandle.WaitAll为此使用方法。有关更多信息,请查看此参考

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

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,因此您必须手动拆分源。

祝你好运!

于 2013-07-26T09:41:15.917 回答
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();
  }
于 2013-07-26T10:09:58.280 回答