【问题标题】:Request thread to quit without forcing it?请求线程退出而不强制它?
【发布时间】:2009-11-03 02:41:40
【问题描述】:

我正在编写一个应用程序。有来自网络的 DL 资源的插件。如果用户想退出,我不希望任何 DL 开始,但我希望正在进行的 DL 继续直到完成。他们停下来后,我会优雅地退出。

我如何确定线程是在 DL 中间还是只是在休眠?实际的下载资源函数在我的基类中并且不是虚拟的,所以我可以编写代码来说明它是否正在进行,但除此之外。我实际上如何将信息传递给主线程以说明其是否处于睡眠状态并在下载过程中终止 VS?

【问题讨论】:

    标签: c# .net multithreading thread-safety


    【解决方案1】:

    最好的方法是创建一个插件实现的接口,允许您查询它们的状态并请求它们停止正在执行的操作(以防您决定稍后添加该功能)。强烈不推荐使用 Thread.Interrupt 和 Thread.Abort。线程状态是absolutely useless。它们不能保证工作,甚至可以让你的代码陷入困境,在无人管理的梦幻岛中关闭。通过创建标准化这些请求的接口,您可以确保您的插件开发人员提供报告状态和安全中止进度的机制。

    如果你认识插件的开发者,我建议你让他们阅读 Jon Skeet 的 threading series

    【讨论】:

    • 创建状态机制。那可行。由于主线程只会读取它,我是否能够简单地拥有一个 int 状态并在需要时读取它?在空闲时终止线程并将其单独留在 DLing 上?但随后要终止我需要thread.abort。所以我应该反过来让所有插件读取 int status {get;} 并要求作者检查这一点。
    • 我实际上会为您的状态枚举创建一个Enum。不要使用Thread.Abort,而是让接口要求插件提供Stop 方法,并让作者使用Jon Skeet 写的线程文章处理优雅的停止。
    • 线程创建监视器锁并立即进入它是否安全,仅在可以安全中止的时候退出锁,然后重新进入它?有些程序在使用非托管 DLL 时会卡住,这些 DLL 在不占用资源时会挂起,最好有办法安全地终止此类线程。
    【解决方案2】:

    由于您正在等待 I/O 资源(文件下载),因此您将不知道线程是在等待 I/O 操作还是因为其他原因而处于休眠状态。

    【讨论】:

      【解决方案3】:

      您可以通过事件支持进度报告、增量结果和取消。 查看 System.ComponentModel.BackgroundWorker

      编辑:这是一个无耻的插件。
      查看 Joe Duffy 的“Windows 上的并发编程”。 它详细解释了很多这些东西。

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 2012-10-27
        • 2018-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 2021-09-23
        • 1970-01-01
        相关资源
        最近更新 更多