多次调用和线程安全

时间:2014-04-29 10:48:22

标签: c# .net thread-safety invokerequired

让我们假设我有工作线程在一些控件上增加一个值。由于需要调用,因此需要在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;
   }
}

谢谢!

1 个答案:

答案 0 :(得分:5)

不,只有一个GUI线程 - 所以你最终会将被调用的代理有效地排队等候串行执行。如果有多个GUI线程,你确实会遇到竞争条件 - 但你对我所知道的所有UI框架都没问题。