首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程工作线程状态

多线程工作线程状态
EN

Stack Overflow用户
提问于 2010-08-27 20:14:54
回答 6查看 3.7K关注 0票数 3

我将我的线程创建为

代码语言:javascript
复制
 for (int i = 0; i < threadCount; i++)
 {
     Searcher src = new Searcher(i, this);

     threads[i] = new Thread(new ThreadStart(src.getIpRange));
     threads[i].Name = string.Format(i.ToString());
  }

  foreach (Thread t in threads)
  {
     t.Start();
  }

使用threadCount(= 100,150,255等...)但是我不知道有多少线程在工作。在执行时。

我想控制所有线程何时完成它们的工作。然后给我一条消息,比如“所有线程都已死,作业已完成...”比如backgroundWorker的RunWorkerCompleted事件

EN

回答 6

Stack Overflow用户

发布于 2010-08-27 20:19:42

确定所有线程何时完成很简单。

代码语言:javascript
复制
for (int i = 0; i < threadCount; i++)
{
    threads[i].Join();
}

Console.WriteLine("All threads are done!");

你能详细说明一下你的其他要求吗?

票数 1
EN

Stack Overflow用户

发布于 2010-08-27 20:19:50

您可以检查线程的ThreadState属性。

使用异步方法可能更好。这将为您提供一个WaitHandle对象,您可以使用WaitHandle.WaitAll等待所有异步方法完成。

下面是对异步编程的介绍:http://msdn.microsoft.com/en-us/library/aa719598%28v=VS.71%29.aspx

票数 1
EN

Stack Overflow用户

发布于 2010-08-27 21:10:15

首先,我必须指出创建100、150、255等线程可能不是一个好主意。最好使用ThreadPoolTask类(如果使用.NET 4.0)。除此之外,还有两种成熟的方法可以等待,直到所有线程完成。

加入线程。

Thread.Join将一直阻塞,直到目标线程完成。

代码语言:javascript
复制
for (int i = 0; i < threadCount; i++) 
{ 
   Searcher src = new Searcher(i, this); 
   threads[i] = new Thread(new ThreadStart(src.getIpRange)); 
   threads[i].Name = string.Format(i.ToString()); 
} 

foreach (Thread t in threads) 
{ 
   t.Start(); 
} 

foreach (Thread t in threads)
{
   t.Join(); 
}

使用CountdownEvent。

CountdownEvent将一直等待,直到其内部计数为零。如果您希望使用ThreadPool,则此方法更适合。如果你没有使用.NET 4.0,你可以在Joe Albahari's website上得到一个非常简单的实现。

代码语言:javascript
复制
var finished = new CountdownEvent(1);

for (int i = 0; i < threadCount; i++) 
{ 
   finished.AddCount();
   Searcher src = new Searcher(i, this); 
   threads[i] = new Thread(
     () =>
     {
        try
        {
          src.getIpRange();
        }
        finally
        {
          finished.Signal();
        }
     }
   threads[i].Name = string.Format(i.ToString()); 
} 

foreach (Thread t in threads) 
{ 
   t.Start(); 
} 

finished.Signal();
finished.WaitOne();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3583979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档