繁体   English   中英

从线程池加入线程

[英]Join threads from thread pool

我有30多个可以并行执行的任务。
我为每个任务使用ThreadPool。
但是,在所有任务完成之前,父功能不应返回。

我需要一个线程同步句柄,当其计数达到0时将释放WaitOne。

foo.StartWith(myTasks.Count);
foreach (var task in myTasks) {
    ThreadPool.QueueUserWorkItem(state => { task(state); foo.Release(); });
}
foo.WaitOne();

Semaphore感觉不错,只是无法弄清楚如何在此处应用它。

int running = myTasks.Count;
AutoResetEvent done = new AutoResetEvent(false);
foreach (var task in myTasks) {
    ThreadPool.QueueUserWorkItem(state => { 
    task(state); 
    if (0 == Interlocked.Decrement(ref running))
      done.Set ();
    });
}
done.WaitOne();

在C#4.0中,您可以使用新的CountdownEvent原语。

乔·达菲Joe Duffy )就这种事情写了一篇很棒的文章:

由内而外的CLR:9种可重用的并行数据结构和算法

我正在考虑特别适合您要求的CountdownLatch。

根据本文的介绍: 同步基元概述

C#在此情况下具有内置类型CountDownEvent: CountdownEvent类

或类似的一种: 屏障(.NET Framework)

对于较新的版本,请使用TPL(任务并行库),对于此场景,此代码是相关的:

// Create an ActionBlock<int> object that prints its input
// and throws ArgumentOutOfRangeException if the input
// is less than zero.
var throwIfNegative = new ActionBlock<int>(n =>
{
   Console.WriteLine("n = {0}", n);
   if (n < 0)
   {
      throw new ArgumentOutOfRangeException();
   }
});

// Post values to the block.
throwIfNegative.Post(0);
throwIfNegative.Post(-1);
throwIfNegative.Post(1);
throwIfNegative.Post(-2);
throwIfNegative.Complete();

// Wait for completion in a try/catch block.
try
{
   throwIfNegative.Completion.Wait();
}
catch (AggregateException ae)
{
   // If an unhandled exception occurs during dataflow processing, all
   // exceptions are propagated through an AggregateException object.
   ae.Handle(e =>
   {
      Console.WriteLine("Encountered {0}: {1}", 
         e.GetType().Name, e.Message);
      return true;
   });
}

/* Output:
n = 0
n = -1
Encountered ArgumentOutOfRangeException: Specified argument was out of the range
 of valid values.
*/

来自https://msdn.microsoft.com/en-us/library/hh228603.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM