我有一个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);
}
答案 0 :(得分:1)
没关系我的评论。开始重构:)。
首先,应用程序停止之前应该有一种方法让while循环结束。也许您可以将CancellationToken
一直使用并传播到Worker
方法。
如果你想保持你的松散耦合,你应该能够通过在调用Application.Current.ShutDown
的类中创建一个事件并在Worker
方法所在的类中订阅它来(并在事件处理程序中调用Pulse)。
如果您这样做,那么您可以将CancellationToken存储在此类中,并在收到事件时将其标记。
在调用Application.Current.ShutDown
之前应该提出该事件。