1

让我们假设我有工作线程来增加某个控件的值。由于需要调用,所有增量都需要在 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;
   }
}

谢谢!

4

1 回答 1

5

不,只有一个 GUI 线程 - 所以你最终会得到有效地排队执行的调用委托。如果有多个 GUI 线程,您确实会在这里遇到竞争条件 - 但您对我所知道的所有 UI 框架都很好。

于 2014-04-29T10:49:54.983 回答