使用Dispatcher.Invoke/BeginInvoke是否固有地提供对代码段的互斥访问

本文关键字:代码 访问 Invoke Dispatcher BeginInvoke 是否 使用 | 更新日期: 2023-09-27 18:24:51

我有一个类似于以下的函数:

public void Increment()
{
    if (Count == 0)
    {
        AttachResource();
    }
    Count++;
}

对我的代码的更改意味着这个函数将从多个线程调用。由于AttachResource()的性质,此函数必须在主线程上运行。

假设我将函数修改如下:

public void Increment()
{
    _dispatcher.Invoke(new Action(() =>
    {
        if (Count == 0)
        {
            AttachResource();
        }
        Count++;
    }));
}

我是否还需要为此代码添加一个锁,以确保线程之间的互斥访问?或者,通过调度器的调用会通过将多个调用序列化到主线程上来自然地实现这一点吗?

使用Dispatcher.Invoke/BeginInvoke是否固有地提供对代码段的互斥访问

您的示例将阻止AttachResource被多次调用,除非其他东西重置Count。

除此之外,假设Dispatcher是UI的Dispatcher实例(例如Application.Current.Dispatcher),那么只有UI线程会从该代码路径调用AttachResource。