【问题标题】:How to call async methods from within a Prism event aggregator subscriber?如何从 Prism 事件聚合器订阅者中调用异步方法?
【发布时间】:2016-06-09 12:09:09
【问题描述】:

快速提问 - 如何从 Prism 事件聚合器订阅者操作​​中调用异步方法?例如

_eventAggregator.GetEvent<PubSubEvent<SomeMessage>>()
   .Subscribe((msg) => {
                       DoSomething();
                       await DoSomethingAsync();
                       DoSomethingElse();
                    });

【问题讨论】:

  • 您可以将async 粘贴在您的 lambda 前面,例如async (msg) =&gt; { ... },但 Subscribe 不会等待它完成。
  • @CharlesMager 啊,就这么简单!非常感谢。
  • @CharlesMager 这将创建异步无效,这是不推荐的解决方案。

标签: c# asynchronous prism


【解决方案1】:

只是让@Charles Mager 成为答案

_eventAggregator.GetEvent<PubSubEvent<SomeMessage>>()
   .Subscribe(async(msg) => {
                       DoSomething();
                       await DoSomethingAsync();
                       DoSomethingElse();
                    });

【讨论】:

  • 它会从这个 lambda 方法创建 async void 方法吗?不推荐吗?
  • 不,这不是好的解决方案。它有效,但它是一种“一劳永逸”的风格。没有发现异常。
【解决方案2】:

使用当前的 Prism 实现,see here 是不可能的。

但我找到了 Prism 的 EventAggregator 的替代实现,它允许async 订阅。见here

这个新的事件异步聚合器重载可以像原来的一样使用:

订阅事件与另一个重载完全相同:


    _eventAggregator.GetEvent<<TfsHookEvent<WorkItemUpdatedPayload>>().Subscribe(WorkItem_Updated);

事件处理程序:


    private async Task WorkItem_Updated(WorkItemUpdatedPayload obj)
    {
        await CheckAsync();
    }

【讨论】:

  • 我们如何包含这些类?似乎没有 Nuget 包,只是将必要的文件粘贴到我自己的解决方案中会导致类冲突
  • 我从上面的源下载了 Prism 源并替换了文件。不是一个理想的解决方案。没有 NuGet 包。
猜你喜欢
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多