如何解决在 C# 类库中,在自己的线程中关闭 WPF LogWatcher 窗口,停止主线程
我编写了一个 C# COM 公开类库。我从第三方软件调用它公开的方法。
我编写了一个 WPF 对话框来在执行业务逻辑时观察日志条目。 在启动生成日志条目的实际方法之前,WPF 对话框在单独的线程上启动。这工作得很好。
我遇到的问题是,如果我在主方法 DoTheActualWorkAsync()
完成之前关闭日志观察器窗口,DoTheActualWorkAsync()
方法会停止运行,方法似乎死锁了。
任何想法如何解决这个问题?为什么在单独的线程中关闭 WPF 窗口会冻结主线程?
这是我的代码:
// Exposed Method
public void DoALotOfWorkWrapper()
{
// Start WPF LogWatchWindow on new thread
var logWatcherThread = this.GetLogWatcherThread();
// Peform a lot of business logic,block for procedure to be ready
DoTheActualWorkAsync().Wait();
// Join logwatcher thread so method doesn't finish before window is closed
WaitForLogWatcherThread(logWatcherThread);
}
private Thread GetLogWatcherThread()
{
var signalEvent = new ManualResetEvent(false);
var logWatchWindowThread = new Thread(() =>
{
var vm = new LogWatchWindowviewmodel();
var win = new LogWatchWindow
{
DataContext = vm
};
win.Show();
vm.HookupLog4NetEvents(win);
win.Closed += (sender2,e2) =>
{
vm.DetachLog4NetEvents();
win.dispatcher.InvokeShutdown();
};
signalEvent.Set();
dispatcher.Run();
});
logWatchWindowThread.SetApartmentState(ApartmentState.STA);
logWatchWindowThread.Start();
// Block to wait for Window and its viewmodel to be ready for displaying new log4net entries
signalEvent.WaitOne();
signalEvent.Reset();
return logWatchWindowThread;
}
private static void WaitForLogWatcherThread(Thread logWatcherThread)
{
logWatcherThread.Join();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。