时间:2010-11-03 20:08:27

标签: c# backgroundworker

我有一个BackgroundWorker调用非GUI线程上的函数。我注意到对于某些表单元素,我可以在不进行调用的情况下更新GUI。其他人仍然会导致运行时错误,因为程序试图以非线程安全的方式更新GUI。

为什么?

2 个答案:

答案 0 :(得分:5)

您可能偶然发现了一些不检查上下文并抛出异常的方法或属性。这并不意味着这样做是个好主意。事实上,我会不惜一切代价避免它。

<强>更新 在这里假设WinForms。 如果您认为调用过于繁琐,请使用扩展方法:

public static class ControlExtensions
{
   public static void Do(this Control c, Action f)
   {
      if (c.InvokeRequired)
      {
         c.Invoke(f);
      }
      else
      {
         f();
      }
   }
}

然后,在BackgroundWorker的DoWork中:

// Background work here
this.Do(() =>
{
   // This runs on UI thread
});

我发现这比BackgroundWorkers ReportProgress更容易使用。

答案 1 :(得分:2)