【问题标题】:Thread Kill timeout线程终止超时
【发布时间】:2012-08-01 21:39:49
【问题描述】:

我有一个动态加载和运行用户编写的 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() 并不那么受欢迎: Timeout Pattern - How bad is Thread.Abort really?

以及用于取消任务的并行编程解决方案,涉及编写“ThrowIfCancellationRequested();”在 dll 执行中(我没有源代码) http://msdn.microsoft.com/en-us/library/dd997396.aspx

【问题讨论】:

  • 这是什么语言?请添加语言标签。
  • 有趣的问题 - 您的设计模式正在生成类似于旧的 Windows 3.x 协作多任务处理的东西,其中一个行为不端的应用程序未能让出 cpu 将挂起其他应用程序(在这里它们不会挂起,但在行为不端的 DLL 完成之前它们不会重新启动) - 不等待所有 DLL 完成,只重新启动那些已经完成的 DLL 怎么样?这是一个选择吗?
  • FWIW,对于调度 Quartz.net 非常有用。 quartznet.sourceforge.net
  • 我可以重新启动那些已经完成的,但是对于那些永远挂起的资源,我会遇到同样的资源问题。
  • 问题到底是什么?

标签: c# multithreading task-parallel-library task


【解决方案1】:

“sgorozco”的第三条评论对我帮助最大,我选择继续异步运行规则,但以这种方式跳过已经在处理的规则我:

  • 按时完成其他正确编写的规则。

  • 跳过卡住的作业。

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

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    相关资源
    最近更新 更多