Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “线程”;悬挂;在监视器上。在Application.Current.ShutDown()之后等待_C#_Wpf_Multithreading_Monitor_Background Thread - Fatal编程技术网

C# “线程”;悬挂;在监视器上。在Application.Current.ShutDown()之后等待

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)很难检索到包含等待线程的对象的引用(以便强制脉冲它,以便它可以退出) 我试着用谷歌搜索一个合适的

我有一个WPF应用程序,用于通过
环境关闭。退出
。由于这导致了我的自动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调试器窗口查找问题制造者。