在 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 (将#修改为@)