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