线程"悬挂"在Application.Current.ShutDown()之后的Monitor.Wait上

时间:2014-08-04 20:00:17

标签: c# wpf multithreading monitor background-thread

我有一个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);
}

1 个答案:

答案 0 :(得分:1)

没关系我的评论。开始重构:)。

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

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

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

在调用Application.Current.ShutDown之前应该提出该事件。