【问题标题】:Not setting ManualResetEvent to true未将 ManualResetEvent 设置为 true
【发布时间】:2013-02-14 12:36:16
【问题描述】:
 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 个 'GetAndMapProduct' 调用中的任何一个中都没有在 ManualResetEvent 对象上设置 'Set()/true',那么这 3 个线程会发生什么。我的意思是,如果我在代码上方循环 7 次并且每次获取 3 个线程而不设置 ManualResetEvent,我就不能使用 CustomThreadPool 类吗?因为 CustomThreadPool 假设所有(7*3)线程都忙于它们的工作并且它没有任何空闲线程可以分配?;

【问题讨论】:

  • 线程池调度程序(即使是自定义调度程序)的工作是让所有线程同时启动。

标签: c# .net multithreading c#-4.0


【解决方案1】:

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

如果您只在同一进程中管理不同的线程,我还建议您使用ManualResetEventSlim (http://msdn.microsoft.com/en-us/library/system.threading.manualreseteventslim.aspx),尤其是当您在GetAndMapProduct 中执行的操作相当快时。但是,目前还不清楚您要完成什么。

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2021-08-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多