程序挂在Dispatcher.Run()c#上

我正在使用此代码在单独的线程中运行ProgressBar.

ProgresBarForm viewer = new ProgressBarForm("Wait");    
Thread viewerThread = new Thread(delegate()
    {
        viewer = new ProgressBarForm("Wait");
        viewer.Show();
        System.Windows.Threading.dispatcher.Run();
    });

viewerThread.SetApartmentState(ApartmentState.STA); // needs to be STA or throws exception
viewerThread.Start();

然后我做了一些长时间的操作,当我完成后我正在调用这段代码

viewer.BeginInvoke(new Action(() => window.Close()));

它工作得很好但是当我关闭窗口时调试器没有停止.在VS 2012中,我点击“全部中断”按钮,程序挂起就行了

System.Windows.Threading.dispatcher.Run();

如何关闭此调度程序以退出程序?

提前感谢所有回复.

解决方法

viewer.BeginInvoke(new Action(() => window.Close()));

这还不足以让调度员停下来.您的“查看器”是Winforms表单,而不是WPF窗口.所以正常的关机机制无法正常工作.您必须提供帮助,并告诉调度员退出

viewer.BeginInvoke(new Action(() => {
       System.Windows.Threading.dispatcher.Currentdispatcher.InvokeShutdown();
       viewer.Close();
   }));

请注意竞争,用户可能会在您有机会调用代码之前关闭WPF窗口. DoEvents()苦难的景象比比皆是.所以你可能还应该将线程的IsBackground属性设置为true.并且要注意在工作线程上显示UI的问题,您必须仔细制作“进度”表单,以便它不使用工具箱中的任何危险控件.那些使用SystemEvents类的.或者你可以调试一个死锁like this.

如果你不让你的UI线程做繁重的工作,这将永远更好,更可靠.让它只关注UI,在工作线程中进行繁重的工作.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...