我需要启动一个线程,它将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();
}
}
答案 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();
}