0
 List<ManualResetEvent> doneEventsList = new List<ManualResetEvent>();

 productBuilders.ForEach(productBuilder =>
            {
                doneEventsList.Add(productBuilder.GetDoneEvent());
                CustomThreadPool.getSingletonInstance.QueueUserWorkItem(productBuilder.GetAndMapProduct, new Object());
            });

            WaitHandle.WaitAll(doneEventsList.ToArray());

我对上面的代码有一点怀疑,

假设CustomThreadPool有 21 个Thread“类”实例的列表,而“ productBuilders”有 3 个构建器。在这种情况下,从 CustomThreadPool 获取的线程计数将为“3”。可以说,如果我在ManualResetEvent这 3 个“”调用中的任何一个中都没有在对象上设置“Set()/true” GetAndMapProduct,那么这 3 个线程会发生什么。我的意思是,如果我在代码上方循环 7 次并且每次获取 3 个线程而不设置ManualResetEvent,我就不能使用 CustomThreadPool 类吗?因为 CustomThreadPool 假设所有(7 * 3)线程都忙于工作并且它没有有任何空闲线程可以分配吗?

4

1 回答 1

1

您没有提供任何代码来暗示这会以任何方式ManualResetEvent影响这 3 个线程。他们唯一会影响(基于您的代码)将是通过调用的当前线程,并且根据您提供和描述的内容,这将是一个死锁。WaitAll

如果您只在同一进程中管理不同的线程,我还建议您使用ManualResetEventSlimhttp://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx),特别是如果您'重新做的GetAndMapProduct相当快。但是,目前还不清楚您要完成什么。

于 2013-02-14T16:31:47.623 回答