使用WaitHandle.WaitAll时,是否可以在ThreadPool中对任务进行分组/隔离?

时间:2010-02-23 23:21:21

标签: .net multithreading thread-safety threadpool

我面临的情况如下。因为ThreadPool是每个进程1个实例,所以我的问题是方法1会在3秒后取消由方法2排队的任务吗?

  

http请求来自

*method 1 gets executed first*:

  ThreadPool.QueueUserWorkItem x 3
  WaitHandle.WaitAll for 3 seconds

*method 2 gets executed after method 1*:

  ThreadPool.QueueUserWorkItem x 10
  WaitHandle.WaitAll for 10 seconds

对不起,我想我完全误解了WaitHandle的用法。似乎如果我在下面做,一切都会按预期工作。很抱歉这个混乱。

var calls = new ManualResetEvent[5];
//ThreadPool.QueueUserWorkItem blah...
WaitHandle.WaitAll(calls, timeOut);

但我仍在考虑当方法1使用长时间运行的任务淹没线程池时会发生什么,方法2只等待1秒。方法2是否会得到它的结果,因为它没有等待足够长的时间。

感谢。

4 个答案:

答案 0 :(得分:1)

不,它不会取消任务。只是你宁愿停止等待。顺便说一下,当WaitAll超过超时时,不会抛出超时异常吗?

答案 1 :(得分:1)

我认为,您应该创建自己的队列+调度程序来处理组操作或任务。 Active Object模式是一个很好的选择。您可以控制操作执行的优先级,可以编写规则以等待组中的某些操作(通过使用Guard方法),等待“任何”或“所有”结果。您可以阅读 article ,它有代码可以尝试使用此模式。

运气!

答案 2 :(得分:1)

正如其他人所指出的那样,等待完成时method 1将不会取消method 2 排队的线程,除非您在{{1>} 中有一些显式代码{1}}具体导致method 1取消

您提到您可能有竞争条件,但除非method 2依赖method 2完成以便对method 1中的结果进行一些计算,否则没有你的例子中明显的竞争条件。

请澄清您认为自己在哪里遇到竞争状况以及为什么,从您当前的例子来看,您似乎没有竞争条件。

答案 3 :(得分:1)

参考您的更新:

请注意,如果您将WaitAll与Windows窗体应用程序一起使用,如果不将入口点设置为[MTAThread](编译器无论如何都会失败),它将无法工作。

This enhanced ThreadPool支持对工作项进行分组(并取消它们),如果您仍在寻找解决方案,这可能有所帮助。