未将ManualResetEvent设置为true

时间:2013-02-14 12:36:17

标签: c# .net multithreading c#-4.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”。让我们说,如果我没有在任何3个ManualResetEvent'调用中的GetAndMapProduct对象上设置'Set()/ true',那么这3个线程会发生什么。我的意思是如果我循环上面的代码7次并且每次获取3个线程并且没有设置ManualResetEvent,我不能使用CustomThreadPool类吗?因为CustomThreadPool假设所有(7 * 3)线程都忙于他们的工作,它没有任何免费的线程分配?;

1 个答案:

答案 0 :(得分:1)

您尚未提供任何代码来暗示ManualResetEvent任何方式影响这三个主题。他们唯一会影响(根据你的代码)是通过调用WaitAll当前线程,并根据你提供和描述的内容,这将是一个死锁

如果您只是在同一个流程中管理不同的主题,我建议您使用ManualResetEventSlimhttp://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx)代替,尤其是如果您在GetAndMapProduct中所做的事情是公平的快。但是,你真的不清楚你想要完成什么。