当使用DispatcherObjectInvoker.Invoke时,是否有一种方法可以确保一个方法在另一个方法之后执行

本文关键字:方法 确保 执行 之后 另一个 一个 Invoke DispatcherObjectInvoker 是否 一种 | 更新日期: 2023-09-27 18:14:59

是否有办法确保第二个语句在第一个语句之后执行?

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

我正在访问第一个语句中触及的网格。网格的刷新仅在大约80%的情况下有效。这里显然有一个竞态条件

当使用DispatcherObjectInvoker.Invoke时,是否有一种方法可以确保一个方法在另一个方法之后执行

为什么不让它们都成为同一个动作的一部分呢?

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

不确定DispatcherObjectInvoker是什么,但我假设它是Dispatcher或其他东西的包装器。

如果是,则呼叫Invoke()为阻塞呼叫。所以你的第二个电话肯定在你第一个电话之后。

然而,如果你的意图是异步调用,你应该使用BeginInvokeDispatcherPriority参数有助于确保对相同优先级级别的调用以相同的顺序进行。因此,如果_layouts引用DispatcherPriority.Loaded优先级(或任何其他优先级),则保证调用以相同的顺序进行。

查看MSDN文档