C# 在UI线程上封送的方法是否需要是线程安全的

C# 在UI线程上封送的方法是否需要是线程安全的,c#,winforms,multithreading,C#,Winforms,Multithreading,如果我在UI线程上调用一个方法,它是否由Windows消息队列进行了searilize,并且随后不需要重新进入 private void CalledFromWorkerThread() { //changed from 'InvokeRequired' Anti-Pattern this.Invoke((Action) (() => _counter++; /* Is this ok? */ )); } 澄清:只有UI线程才会访问

如果我在UI线程上调用一个方法,它是否由Windows消息队列进行了searilize,并且随后不需要重新进入

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

澄清:只有UI线程才会访问计数器。

假设只有UI线程才能访问计数器


如果两个线程调用从WorkerThread调用的
,那么_计数器将正确递增,并且线程安全。

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

根据说明,只有UI线程正在访问_计数器,您不需要锁。我已经更新了我的示例。我更喜欢这样编码,以避免额外的if-invoke-required检查

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

如果还没有,也应该在计数器上使用锁。另请参见此处:测试
invokererequired
是一种反模式
Control.Invoke
已经包含这样一个检查。@0A0D Mr Skeet在上述链接中调用的方法中没有使用锁吗?如果只有UI线程访问
\u计数器
,那么这是安全的,这是我的原始问题?是的,只要它是UI线程,您就正确。假设这是唯一更改该字段的代码!它是线程安全的吗?那么它是唯一访问它的线程(因此它不需要是线程安全的)。所以,是的,它是安全的。