主线程不能破解WPF BusyWindow

如何在单独的线程中创建真正牢不可破的wpf繁忙窗口? 主线程运行一些持续密集的计算代码。 此代码不允许调用UI刷新(DoEvents)(不具有循环),并且不能移动到单独的线程。

繁忙窗口有一些微调/进度,应该旋转/移动。 但是如果主线程运行密集计算,它不会旋转/移动。

如果主线程运行密集型计算(也不是Task,也不是BackgroundWorker),则大多数“在单独线程中忙窗口” - 建立在Web上 - 不起作用。 限制是.NET Framework 4.0。

对于测试,如果我尝试在主线程中运行密集代码:

while(true) {}

那么大多数网页“单独线程中的繁忙窗口”被阻止。

我对这段代码有最好的结果:

 var thread = new Thread(new ThreadStart(() =>
        {
            SynchronizationContext.SetSynchronizationContext(
                new DispatcherSynchronizationContext(
                    Dispatcher.CurrentDispatcher));

            asyncCtl = creator();
            asyncCtl.CreateControl();
            asyncCtl.Show();

            System.Windows.Threading.Dispatcher.Run();
        }));


        thread.SetApartmentState(ApartmentState.STA);
        thread.IsBackground = true;
        thread.Start();

        Dispatcher.CurrentDispatcher.ShutdownStarted += CurrentDispatcher_ShutdownStarted;
        Dispatcher.CurrentDispatcher.ShutdownFinished += CurrentDispatcher_ShutdownFinished;

当计算功能完成时,该代码被称为:

  asyncCtl.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Background);

但是 - 事件ShutdownStarted / ShutdownFinished在主线程退出时被调用。 这在我看来太迟了。 如果应用程序运行10次BusyWindow,则在主线程出口上调用这些事件10次。 我怕如果有10次显示BusyWindow,那么挂起最近结束的10个非关闭线程 - 在主应用程序退出。

那么,如何正确地创建和处理这样繁忙的窗口呢? 谢谢。

链接地址: http://www.djcxy.com/p/37999.html

上一篇: WPF BusyWindow unbreakable by main thread

下一篇: Avoiding focus change when selecting range