问题描述
我编写了一个 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 (将#修改为@)