c# - 为什么我不需要调用非 GUI 线程的某些表单元素?

标签 c# backgroundworker

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

这是为什么?

最佳答案

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

更新: 假设这里是 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 更容易使用。

关于c# - 为什么我不需要调用非 GUI 线程的某些表单元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4091204/

相关文章:

c# - 验证托管 TFS : TF30063: You are not authorized to access . visualstudio.com

c# - 使用递归从 IDictionary 中删除项目

vb.net - 进度条和代码位置的多线程(vb.net)?

C# 背景 worker

c# - 更适合我的任务 : background worker or thread pool?

c# - BackGroundworker 取消不适用于 wbadmin.exe

c# - 处理 BackGroundWorker 的正确方法

java - 将 Java 构造函数从抽象类和 super 关键字转换为 C# 时出错?

c# - 处理鼠标右键双击形状

c# - 为什么我需要 Dispose 一个 System.Net.Mail.MailMessage 实例?