在UI线程上编组的方法是否需要是线程安全的

时间:2011-06-24 13:41:45

标签: c# winforms multithreading

如果我在UI上调用一个方法线程是否由Windows消息队列进行了搜索,随后又不需要重入?

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

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

3 个答案:

答案 0 :(得分:9)

你所拥有的是好的,假设只有UI线程才能访问_counter

如果两个线程调用你的CalledFromWorkerThread,那么_counter将正确增加并保持线程安全。

答案 1 :(得分:4)

根据澄清,只有UI线程正在访问_counter,您不需要锁定。我已经更新了我的例子。我更喜欢用这种方式编码,以避免额外的调用,如果需要调用。

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

答案 2 :(得分:2)

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