程序挂在Dispatcher.Run()c#上
发布时间:2020-12-16 02:03:57 所属栏目:百科 来源:网络整理
导读:我正在使用此代码在单独的线程中运行ProgressBar. ProgresBarForm viewer = new ProgressBarForm("Wait"); Thread viewerThread = new Thread(delegate() { viewer = new ProgressBarForm("Wait"); viewer.Show(); System.Windows.Threading.Dispatcher.Run(
我正在使用此代码在单独的线程中运行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,在工作线程中进行繁重的工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容