C# “线程”;悬挂;在监视器上。在Application.Current.ShutDown()之后等待
我有一个WPF应用程序,用于通过C# “线程”;悬挂;在监视器上。在Application.Current.ShutDown()之后等待,c#,wpf,multithreading,monitor,background-thread,C#,Wpf,Multithreading,Monitor,Background Thread,我有一个WPF应用程序,用于通过环境关闭。退出。由于这导致了我的自动UI测试出现问题,我将退出的应用程序更改为application.Current.ShutDown 这可以正常工作,除了有一个线程正在等待脉冲(Monitor.Wait),该线程使进程保持运行,因为它再也不会脉冲了 我认为这是一个很容易解决的问题,但是从我的应用程序退出的地方(application.Current.ShutDown)很难检索到包含等待线程的对象的引用(以便强制脉冲它,以便它可以退出) 我试着用谷歌搜索一个合适的
环境关闭。退出。由于这导致了我的自动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存储在此类中,并在收到事件时对其进行标记
调用应用程序.Current.ShutDown
之前应引发该事件。您查看的问题线程不正确,IsBackground设置为true的线程无法阻止应用程序终止。使用Debug+Windows+Threads调试器窗口查找问题制造者。