【问题标题】:How can I limit how long a task runs under .Net?如何限制任务在 .Net 下运行的时间?
【发布时间】:2011-02-03 10:04:13
【问题描述】:

我知道有多种方法可以限制任务在 .Net 下运行的时间,我想知道我是否遗漏了其他任何方法,或者对我以前使用的方法进行了修改/改进。

在我不清楚方法的具体功能的地方,我已经提出了有关它的问题。

我知道的现有方法,但不一定自己使用:

  1. 创建一个Thread,轮询它完成一段时间然后终止线程。这个解决方案不是很好,因为它依赖于有点讨厌的ThreadAbortException,如果我记得你不能保证你的代码会退出哪里,即它可能会留下未管理的资源在使用等。
  2. 使用IAsyncResult 模式,问题在于您可以等待一段时间,但没有简单的方法来表示您希望中止请求,因此您必须依赖设置在异步代码中检查并导致其停止的布尔标志(或类似标志)。这里的问题是,如果异步代码卡在代码的某个部分,它可能会在实际终止之前继续运行一段时间。
  3. 我经常看到人们推荐 BackgroundWorker 用于异步的东西,但你可以在 ASP.Net 下使用它吗(我假设是这样),它是否有一种简单的方法可以在一段时间后终止异步进程?
  4. 在 .Net 4.0 中使用 Task API(目前我所有的工作都被限制在 .Net 3.5 中,所以我不能选择)。通过快速阅读 MSDN 文档,您可以轻松地使用 CancellationToken 取消任务,但取消的速度有多快,它是否确保调用任何 finally 块。

欢迎所有解决方案/建议/方法

【问题讨论】:

    标签: .net multithreading backgroundworker task iasyncresult


    【解决方案1】:

    最安全的取消形式始终是合作。

    我建议永远不要杀死线程(通过ThreadAbortException)。如果您绝对别无选择,则将该代码改为单独的进程,可以将其完全杀死。 AppDomain 是个好主意,但它们无法适应现实世界。

    IAsyncResultBackgroundWorkerCancellationToken都是合作取消的形式。所以它们都非常干净(不会丢失资源,调用finally 块,...),但缺点是它们无法处理“流氓”代码。

    如果您正在编写后台任务代码,则只需使用BackgroundWorkerCancellationToken。如果您必须使用可能是“流氓”代码,则将其包装在一个单独的进程中。

    BackgroundWorker 在 ASP.NET 中可以正常工作,而 supports cooperative cancellation

    【讨论】:

      【解决方案2】:

      4 中的取消标记和 2 中的布尔标志是同一种机制。在这两种情况下,任务都必须合作并定期检查标志。 4 的优点是你有一个标准化的标志,而不是创建你自己的。

      中止线程是邪恶的,但如果你的代码写得很仔细,它是可以管理的。特别是它很容易破坏全局状态。

      中止线程的安全版本是在不同的应用程序域中运行它。然后在线程被杀死后卸载应用程序域。如果您的所有非托管资源都有正确的关键终结器/使用 SafeHandles,这将以安全的方式工作。

      【讨论】:

        猜你喜欢
        • 2011-01-19
        • 2020-01-22
        • 2021-06-12
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 2015-06-21
        • 2021-07-09
        • 1970-01-01
        相关资源
        最近更新 更多