我有一个 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/