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のインスタンスのリストがあり、' 'には3つのビルダーがあるとします。この場合、取得したスレッド数はCustomThreadPoolから「3」になります。たとえば、その3つの呼び出しのいずれかでオブジェクトに'Set()/ true'を設定していない場合、、、これらの3つのスレッドはどうなりますか。つまり、上記のコードを7回ループし、毎回3つのスレッドを取得し、設定しない場合、CustomThreadPoolクラスを使用することはできませんか?割り当てるフリースレッドはありますか?;ThreadproductBuildersManualResetEventGetAndMapProductManualResetEvent

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 に答える