2012-08-01 131 views
2

我有一个应用程序,动态加载和运行用户写的DLL。它有一个在计时器上运行的调度引擎,并检查运行哪些“规则”(dll)。每个规则是用在自己的线程开始:线程杀死超时

private void OnTimer(...) 
{ 
    timer.stop(); 
    ... 
    foreach(RuleData ruleData in RulesToRun) 
     ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ExecuteRule), ruleData); 
    _asyncOpsAreDone.WaitOne(); 
    timer.start(); 
} 

当异步操作完成后,该程序等待schedualing计时器滴答并运行另一个循环。

问题是,有时用户会写出花费大量时间运行的dll。

  • 如果我会等待:这将推迟一个时钟嘀哒(因为它在执行是采空后再次启动)
  • 如果我不会等待:我在寻找未知数量的运行规则并行,完成我的应用程序用户池。

如果您将考虑到一个规则执行可能会挂起,我的选择介于两者之间:同步 - 挂起所有规则或异步干式资源池。

我认真地想过放弃规则的执行超时,但.Abort()是不那么受欢迎: Timeout Pattern - How bad is Thread.Abort really?

而且并行任务的消技术progrming解决方案,包括编写“ThrowIfCancellationRequested();”在DLL执行(我没有源代码) http://msdn.microsoft.com/en-us/library/dd997396.aspx

+0

这是什么语言?请添加一个语言标签。 – Gray 2012-08-01 21:41:58

+0

有趣的问题 - 您的设计模式产生类似于旧的Windows 3.x协同多任务,其中一个行为异常的应用程序无法产生CPU将挂起其他人(在这里,他们不会挂起,但他们不会重新启动直到错误的DLL完成) - 那么不等待所有的DLL完成,只重启那些已经完成的DLL呢?这是一个选择吗? – 2012-08-01 22:01:26

+0

FWIW,用于调度Quartz.net非常有用。 http://quartznet.sourceforge.net/ – 2012-08-01 23:17:27

回答

0

通过“sgorozco”第三个评论帮助过我的,我选择最继续asyncronously运行规则,但跳过已经是那些正在处理这种方式I:

  • 准时完成工作,完成其他写入正确的规则。

  • 跳过卡住的作业。

  • 避免杀死线程并留下破碎的内存垃圾。