【问题标题】:MVVMLight Message Bus single sync/asyncMVVMLight 消息总线单同步/异步
【发布时间】:2014-07-25 02:38:34
【问题描述】:

Silverlight 应用程序的MVVMLight 具有消息总线。视图模型可以在彼此之间发送消息,因此它们都可以解耦。我的问题是,发送消息是同步还是异步操作?

在以下代码中,主(协调)视图模型向所有子 VM 发送消息以加载数据。加载完所有数据后,Main VM 必须显示一个状态,说明所有数据已加载,该状态在变量 IsAllChildViewModelsCompletedLoading 中设置 .

MainVM.PopulateData()
{
    IsAllChildViewModelsCompletedLoading = false; // Line 1

    MessageBus.Send(new Child1VMMessage()); // Line 2
    MessageBus.Send(new Child2VMMessage()); // Line 3
    MessageBus.Send(new Child3VMMessage()); // Line 4

    IsAllChildViewModelsCompletedLoading = true; // Line 5
}

在上面的代码中,第 3 行的 MessageBus.Send 是否等到第 2 行的 MessageBus.Send 完成。第 5 行的代码是不是只有在 2,3,4 的代码执行完后才会执行?或者 PopulateData 方法会通过将标志 IsAllChildViewModelsCompletedLoading 设置为 true 来更快地退出,并且我们无法知道使用上述方法完成所有子 VM 的加载?

【问题讨论】:

    标签: mvvm messaging


    【解决方案1】:

    经过一些调试,我得出的结论是它们是同步的,不会在不同的线程中运行,所以调用第 5 行是安全的。

    【讨论】:

      【解决方案2】:

      根据 Laurent Bugnion 的 MSDN article,信使操作是同步的。

      【讨论】:

        【解决方案3】:

        是的,但是……

        您可以在处理消息时在侦听器中使用异步方法。 或者也可以在消息回调中。

        【讨论】:

        • 使用三个异步操作也会异步运行,所以将 IsAllChildViewModelsCompletedLoading 设置为 true 是安全的。将所有三个操作都转换为任务具有并行运行它们的优势。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-27
        • 1970-01-01
        • 2015-04-12
        • 2017-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多