监视器上的线程"hanging"。等待后应用程序.当前.关闭()



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

这工作得很好,除了有一个线程正在等待脉冲(Monitor.Wait),它保持进程运行,因为它永远不会得到脉冲了。

我认为这将是一个没有头脑的修复,但从我的应用程序退出(Application.Current.ShutDown)的点很难检索到持有等待线程的对象的引用(为了强制脉冲它,以便它可以退出)。

我试着用谷歌搜索一个合适的答案,但还没有多少运气。有"简单的方法"吗?还是我应该开始重构了?:)

一些片段:

线程是这样创建的

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

Worker方法中,Monitor.Wait被称为

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

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

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

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

如果您这样做,那么您可以将CancellationToken存储在该类中,并在接收到事件时标记它。

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

最新更新