我有一个动态加载和运行用户编写的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。
如果您考虑到一个规则执行可能会挂起,我选择的是:同步 - 挂起所有规则,或者Asynch - 干资源池。
我认真考虑过将规则执行暂停,但是.Abort()并不那么受欢迎: Timeout Pattern - How bad is Thread.Abort really?
用于取消任务的并行编程解决方案,涉及编写“ThrowIfCancellationRequested();”在DLL执行中(我没有源代码) http://msdn.microsoft.com/en-us/library/dd997396.aspx
答案 0 :(得分:0)
“sgorozco”的第三条评论给了我最大的帮助,我选择继续执行规则异步,但跳过那些已经在进行中的规则我:
按时完成正确写入的其他规则。
跳过卡住的作业。
避免杀死线程并留下破碎的内存垃圾。