我有一个动态加载和运行用户编写的 DLL 的应用程序。它有一个在计时器上运行的调度引擎,并检查要运行的“规则”(dll)。每个规则都在其自己的线程上使用:
private void OnTimer(...)
{
timer.stop();
...
foreach(RuleData ruleData in RulesToRun)
ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ExecuteRule), ruleData);
_asyncOpsAreDone.WaitOne();
timer.start();
}
当异步操作完成后,程序等待调度计时器计时并运行另一个循环。
问题是有时用户编写的 dll 需要很长时间才能运行。
- 如果我要等待:这将推迟下一个计时器滴答(因为它在执行时停止并在之后再次启动)
- 如果我不等待:我正在寻找并行运行的未知数量的规则,以完成我的应用程序用户池。
如果您考虑到一个规则执行可能会挂起,我的选择是:同步 - 挂起所有规则,或异步 - 干燥资源池。
我认真考虑过让规则执行超时,但 .Abort() 并不那么受欢迎: 超时模式 - Thread.Abort 到底有多糟糕?
以及用于取消任务的并行编程解决方案,涉及编写“ThrowIfCancellationRequested();” 在 dll 执行中(我没有源代码) http://msdn.microsoft.com/en-us/library/dd997396.aspx