c# - 如何使事件回调进入我的 win 表单线程安全?

标签 c# .net winforms multithreading events

当您从表单中订阅对象上的事件时,您实际上是将回调方法的控制权移交给了事件源。您不知道该事件源是否会选择在不同的线程上触发事件。

问题是当回调被调用时,你不能假设你可以在你的表单上更新控件,因为有时如果事件回调是在一个不同于表单运行的线程上调用的,那么这些控件会抛出异常上。

最佳答案

为了稍微简化 Simon 的代码,您可以使用内置的通用 Action 委托(delegate)。它可以避免在代码中加入一堆你并不真正需要的委托(delegate)类型。此外,在 .NET 3.5 中,他们向 Invoke 方法添加了一个 params 参数,因此您不必定义临时数组。

void SomethingHappened(object sender, EventArgs ea)
{
   if (InvokeRequired)
   {
      Invoke(new Action<object, EventArgs>(SomethingHappened), sender, ea);
      return;
   }

   textBox1.Text = "Something happened";
}

关于c# - 如何使事件回调进入我的 win 表单线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6184/

相关文章:

c# - XElement 不会返回任何媒体 :content/xmlns:media breaks XElement

c# - 寻求有关开展事件的建议

c# - 在 Watin 中调用 Javascript

C# CheckListBox - 如何添加对象并让该对象显示文本

c# - 如何在调用 window.showdialog 后以编程方式关闭窗口?

c# - 对 Web Api 的 MVC 请求

javascript - 从 map 中的点坐标查找具有名称的谷歌地图地点

javascript - 如何在更新后刷新内容.Net C# (EXT.net) webforms 应用程序

c# - 调用异步方法时到底发生了什么?

vb.net - 什么都没有和 system.DBNull 的区别