【问题标题】:Thread "hanging" on Monitor.Wait after Application.Current.ShutDown()在 Application.Current.ShutDown() 之后,Monitor.Wait 上的线程“挂起”
【发布时间】:2014-08-04 20:00:17
【问题描述】:

我有一个 WPF 应用程序,它曾经通过 Environment.Exit 关闭。由于这导致我的自动化 UI 测试出现问题,我将现有应用程序更改为 Application.Current.ShutDown

这工作正常,除了有一个线程正在等待脉冲 (Monitor.Wait),它使进程保持运行,因为它不再被脉冲。

我认为这很容易解决,但从我的应用程序退出点(Application.Current.ShutDown)开始,很难检索对持有等待线程的对象的引用(以强制脉冲它,以便它可以退出)。

我试图用谷歌搜索一个合适的答案,但运气不佳。有没有“简单的方法”解决这个问题?还是我应该已经开始重构? :)

一些sn-ps:

线程是这样创建的

workerThread = new Thread(Worker) { Name = logName, IsBackground = true};

Worker方法中,Monitor.Wait被调用

while ((action = GetNextTask(out task)) == ProductPreparationAction.None)
{
    Monitor.Wait(preparationTasks);
}

【问题讨论】:

  • 您正在查看问题的错误线程,将 IsBackground 设置为 true 的线程无法阻止应用程序终止。使用 Debug + Windows + Threads 调试器窗口查找问题制造者。

标签: c# wpf multithreading monitor background-thread


【解决方案1】:

别在意我的评论。开始重构:)。

首先,应该有一种方法可以让 while 循环在应用停止之前结束。也许您可以使用并传播 CancellationToken 一直到 Worker 方法。

如果您想保持松散耦合,您应该能够通过在调用 Application.Current.ShutDown 的类中创建一个事件并在 Worker 方法所在的类中订阅它来进行脉冲(并调用 Pulse in事件处理程序)。

如果您这样做,那么您可以将 CancellationToken 存储在此类中,并在收到事件时对其进行标记。

应该在调用Application.Current.ShutDown之前引发该事件。

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多