Csharp线程在一个完成时开始新线程而不等待连接

时间:2011-08-21 20:41:09

标签: c# multithreading

我整个上午都在搜索,似乎无法找到这个问题的答案。

我有一个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();
                }

            }

3 个答案:

答案 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)

获取每个线程,作为它做的最后一件事,表明它已完成。这样就不需要等待了。

更好地转向更高级别的抽象,例如线程池,让其他人担心这些细节。