我整个上午都在搜索,似乎无法找到这个问题的答案。
我有一个Threads数组,每个都在做工作,然后我将循环遍历每个开始新线程的ID。什么是检测线程何时完成的最佳方法,这样我可以在不等待每个线程完成的情况下触发新线程?
EDIT添加了代码片段,这可能会有所帮助
if (threadCount > maxItems)
{
threadCount = maxItems;
}
threads = new Thread[threadCount];
for (int i = 0; i < threadCount; i++)
{
threads[i] = new Thread(delegate() { this.StartThread(); });
threads[i].Start();
}
while (loopCounter < threadCount)
{
if (loopCounter == (threadCount - 1))
{
loopCounter = 0;
}
if (threads[loopCounter].ThreadState == ThreadState.Stopped)
{
threads[loopCounter] = new Thread(delegate() { this.StartThread(); });
threads[loopCounter].Start();
}
}
答案 0 :(得分:7)
不是每次都创建新线程,为什么不让每个线程调用一个返回下一个ID的函数(如果没有更多的数据要处理,则返回null)当它完成当前的一个?该函数显然必须是线程安全的,但是应该减少你的开销,而不是观察完成的线程并开始新的线程。
所以,
void RunWorkerThreads(int threadCount) {
for (int i = 0; i < threadCount; ++i) {
new Thread(() => {
while(true) {
var nextItem = GetNextItem();
if (nextItem == null) break;
/*do work*/
}
}).Start();
}
}
T GetNextItem() {
lock(_lockObject) {
//return the next item
}
}
我可能会拉出GetNextItem并“运行”并将它们作为参数传递给RunWorkerThreads以使其更通用 - 所以它将是RunWorkerThreads<T>(int count, Func<T> getNextItem, Action<T> workDoer)
,但这取决于你。
请注意,Parallel.ForEach()基本上可以做到这一点,但是还提供了监视和中止等方法,所以可能没有必要在这里重新发明轮子。
答案 1 :(得分:0)
你可以检查线程的ThreadState
属性,当它是Stopped
时,你可以启动一个新线程。
http://msdn.microsoft.com/en-us/library/system.threading.thread.threadstate.aspx
http://msdn.microsoft.com/en-us/library/system.threading.threadstate.aspx
答案 2 :(得分:0)
获取每个线程,作为它做的最后一件事,表明它已完成。这样就不需要等待了。
更好地转向更高级别的抽象,例如线程池,让其他人担心这些细节。