当您从表单中订阅对象上的事件时,您实际上是将回调方法的控制权移交给了事件源。您不知道该事件源是否会选择在不同的线程上触发事件。
问题是当回调被调用时,你不能假设你可以在你的表单上更新控件,因为有时如果事件回调是在一个不同于表单运行的线程上调用的,那么这些控件会抛出异常上。
最佳答案
为了稍微简化 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/