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