主线程不能破解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