我面临的情况如下。因为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是否会得到它的结果,因为它没有等待足够长的时间。
感谢。
答案 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支持对工作项进行分组(并取消它们),如果您仍在寻找解决方案,这可能有所帮助。