1

无论如何运行大量 UI 更新而不影响 C# winforms 应用程序中的主线程?

当用户单击特定事件时,我想避免长时间延迟(在我的情况下,这是许多关闭表单调用来处理内存)

我知道我可以用来BackgroundWorker在“做工作”事件中执行冗长的操作,但问题是你不能在这个事件中更改任何 UI(它会导致跨线程异常) - 所以我不能把我的大量关闭表单在这里打电话。

而且我不能将关闭表单调用放在“工人完成”事件中,因为这是在主线程上运行的,并且最终会锁定主线程,从而导致糟糕的用户体验。

我曾考虑过仅在应用程序会话空闲时才生成一个线程来处理关闭,但不确定这是否会有点混乱。

4

1 回答 1

2

您应该使用BackgroundWorker的ProgressChanged事件来更新 UI。要启用此功能,请将BackgroundWorker实例的WorkerReportsProgress属性设置为. 然后,您可以通过从DoWork事件处理程序发送数据来多次更新 UI :true

backgroundWorker.ReportProgress(percentage, yourCustomData);

建议对Windows 窗体控件进行线程安全调用。原因如下:

对 Windows 窗体控件的访问本质上不是线程安全的。如果您有两个或更多线程操作控件的状态,则可能会强制控件进入不一致的状态。其他与线程相关的错误也是可能的,包括竞争条件和死锁。确保以线程安全的方式访问控件很重要。

.NET Framework 可帮助您检测何时以非线程安全的方式访问控件。当您在调试器中运行应用程序并且创建控件的线程以外的线程尝试调用该控件时,调试器会引发 InvalidOperationException 并显示消息“从线程以外的线程访问的控件名称”创建于。”

此异常在调试期间可靠地发生,在某些情况下,在运行时发生。强烈建议您在看到此问题时解决此问题。

您可以禁用该异常:

Form.CheckForIllegalCrossThreadCalls = false;

但是控件可能(有时会)停止工作。

于 2012-10-31T12:24:44.683 回答