c#2.0中的UI冻结问题

c#2.0中的UI冻结问题,c#,C#,有时,当我从表单中调用一个方法来做一些事情时,我的UI会冻结。如何解决这个问题?若我在单独的线程中调用该方法,那个么问题会得到解决吗 如果我在单独的线程中调用方法,如下面的代码所示 new System.Threading.Thread(delegate() { HeavyMethod(); }).Start(); 这解决了我的问题还是有更好的解决方案?在后台工作者上调用该方法将是最好的解决方案。 这样,您可以控制何时更新内容(使用报告进度功能),并允许您取消工作 另外,确保在backg

有时,当我从表单中调用一个方法来做一些事情时,我的UI会冻结。如何解决这个问题?若我在单独的线程中调用该方法,那个么问题会得到解决吗

如果我在单独的线程中调用方法,如下面的代码所示

new System.Threading.Thread(delegate()
{
  HeavyMethod();
}).Start();

这解决了我的问题还是有更好的解决方案?

在后台工作者上调用该方法将是最好的解决方案。

这样,您可以控制何时更新内容(使用报告进度功能),并允许您取消工作

另外,确保在
backgroundWorker1.RunWorkerAsync()中操作的任何资源已正确共享。您可以进入所谓的“竞争条件”,这会导致您的输出不确定(例如,您不会在每次运行该方法时都得到相同的结果)

有关多线程和共享资源的详细介绍,请参阅以下链接:

如果调用方法响应事件,则默认情况下,该方法将在GUI线程(运行时用于处理所有用户事件的线程)上运行。如果该方法很大和/或很重,那么它将“冻结”您描述的UI

对于许多这样的情况,让它在单独的线程上运行是一个可行的解决方案

但是,在某些情况下,您实际上希望UI“阻塞”(例如,如果您正在更新许多控件,您不希望用户同时干扰它们)。对于这种情况,最明智的方法是弹出一个模式“等待”对话框。

因为它是C#2.0,我想它是WinForms。不要用CPU绑定的代码阻塞UI线程

您可以生成一个新线程来运行CPU绑定的代码,但必须小心不要访问WinForms控件,尤其是不要更新控件属性。许多WinForms控件只能从UI线程访问/更新。检查InvokeRequired字段,查看是否需要将来自另一个线程的调用封送(即使用Invoke)回UI线程


也考虑使用线程池而不是创建一个新线程。

这是正确的,如果你把沉重的处理从UI线程中移开,那么它应该释放UI重新绘制。对于您想要做的事情,您的实现应该工作得很好。虽然ThreadPooling或BackgroundWorker将是建议的实现(http://msdn.microsoft.com/en-us/library/system.threading.threadpool(v=VS.80).aspx)(http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx).

BackgroundWorker
肯定是在WinForms.Net 2.0中。事实上,是2.0以上。还要注意,它是.Net的一个特性,而不是C#。事实上,C语言还没有3.5版(VS2008附带了C#3.0和.NET3.5)。这是.net 2.0的MSDN文档。哦,.NET2.0基本上与.NET3.5是一样的,只是.NET3.5添加了一些语法上的糖分。这就是为什么您可以在.net 2.0 web服务器上托管.net 3.5 web应用程序的原因。所有代码都编译成相同的IL。以下是一条解释差异的线索: