微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C# 类库中,在自己的线程中关闭 WPF LogWatcher 窗口,停止主线程

如何解决在 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 举报,一经查实,本站将立刻删除。