Есть ли способ убедиться, что один метод выполняется за другим при использовании DispatcherObjectInvoker.Invoke - PullRequest
0 голосов
/ 17 ноября 2011

Есть ли способ обеспечить выполнение второго оператора после первого?

DispatcherObjectInvoker.Invoke(_layouts,
    () =>
        _layouts.RaiseEvent(new LayoutEventArgs(
            MainScreen.ChangedLayoutEvent,
            this)));

DispatcherObjectInvoker.Invoke(_layouts, Grid.Refresh);

Я получаю доступ к Grid, который затрагивается в первом операторе.Обновление сетки работает только в 80% случаев.У меня здесь явно есть состояние гонки.

Ответы [ 2 ]

3 голосов
/ 17 ноября 2011

Почему бы не сделать их обоих частью одного и того же действия?

DispatcherObjectInvoker.Invoke(_layouts, () => 
{
     _layouts.RaiseEvent(new LayoutEventArgs(MainScreen.ChangedLayoutEvent,
                                             this));
     Grid.Refresh();
 });
0 голосов
/ 17 ноября 2011

Не уверен, что такое DispatcherObjectInvoker, но я предполагаю, что это оболочка для Dispatcher или чего-то еще.

Если это так, если вы звоните Invoke(), это блокирующий вызов. Таким образом, ваш второй звонок гарантированно будет после вашего первого звонка.

Однако, если вы хотите, чтобы это были асинхронные вызовы, вы должны использовать BeginInvoke. Параметр DispatcherPriority помогает гарантировать, что вызовы, сделанные на тот же уровень приоритета, находятся в том же порядке. Таким образом, если _layouts относится к приоритету DispatcherPriority.Loaded (или любому другому приоритету), вызовы гарантированно будут в том же порядке.

Проверьте MSDN документацию .

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