我有一个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
之前引发。