让我们假设我有工作线程在一些控件上增加一个值。由于需要调用,因此需要在GUI线程上完成所有增量。为此,我使用BeginInvoke。
我的问题是:
竞争条件是否会破坏控件的增量,因为多个工作线程都同时在GUI线程上调用(并且增量本身someControl.Value += value;
显然不是原子的)?
或者说相反:
一个Invoke是否可以在完成另一个Invoke之前完成?
delegate void valueDelegate(int value);
private void IncrementValue(int value)
{
if (InvokeRequired)
{
BeginInvoke(new valueDelegate(IncrementValue),value);
}
else
{
someControl.Value += value;
}
}
谢谢!
答案 0 :(得分:5)
不,只有一个GUI线程 - 所以你最终会将被调用的代理有效地排队等候串行执行。如果有多个GUI线程,你确实会遇到竞争条件 - 但你对我所知道的所有UI框架都没问题。