2011-06-24 19 views
9

如果我在UI上调用方法线程是否被Windows消息队列搜索到,并且随后不需要重新进入?在UI线程上编组的方法是否需要线程安全

private void CalledFromWorkerThread() 
    { 
     //changed from 'InvokeRequired' Anti-Pattern 
     this.Invoke((Action) (() => _counter++; /* Is this ok? */)); 
    } 

澄清:只有将访问_counter UI线程。

+0

如果您还没有,还应该在柜台上使用锁定。 – 2011-06-24 13:47:29

+1

另请参见:http://www.yoda.arachsys.com/csharp/threads/winforms.shtml – 2011-06-24 13:51:25

+3

测试'InvokeRequired'是一种反模式。 'Control.Invoke'已经包含这样一个检查。 –

回答

9

你有什么好,假设_counter只能被UI线程访问。

如果两个线程调用您的CalledFromWorkerThread,那么_counter将会正确递增并且线程安全。

2

它将委托来自同一线程的调用,并不一定意味着您在该函数中执行的所有操作都将是线程安全的。

+0

假设这是改变该字段的唯一代码!线程安全吗? –

+0

然后它的唯一线程访问它(所以它不需要线程安全)。所以,是的,这是安全的。 – ghimireniraj

4

基于澄清,只有UI线程正在访问_counter,您不需要锁定。我已更新我的示例。我更喜欢用这种方式编码,以避免额外的调用所需的检查。

private void CalledFromWorkerThred() 
{ 
    this.Invoke((Action) (() => _counter++;)); 
} 
+0

+1我更新了这个问题。欢呼声,耳朵。 –