Обеспечивает ли использование Dispatcher.Invoke / BeginInvoke взаимоисключающий доступ к разделу кода? - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть функция, подобная следующей:

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

    Count++;
}

Изменения в моем коде означают, что эта функция будет вызываться из нескольких потоков. Из-за природы AttachResource () эта функция должна выполняться в главном потоке.

Предположим, я изменяю функцию следующим образом:

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

        Count++;
    }));
}

Нужно ли также добавлять блокировку к этому коду для обеспечения взаимоисключающего доступа по потокам? Или вызов через диспетчера естественным образом выполнит это путем сериализации нескольких вызовов в основной поток?

1 Ответ

2 голосов
/ 15 февраля 2012

Ваши примеры будут препятствовать тому, чтобы AttachResource вызывался более одного раза, если что-то еще не сбрасывает Count.

Кроме того, если Dispatcher является экземпляром диспетчера пользовательского интерфейса (например, Application.Current.Dispatcher), то только поток пользовательского интерфейса будет вызывать AttachResource из этого пути кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...