如何在Prism事件聚合器订阅者中调用异步方法?

9

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

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

3
жӮЁеҸҜд»ҘеңЁlambdaеүҚйқўеҠ дёҠasyncпјҢдҫӢеҰӮasync (msg) => { ... }пјҢдҪҶжҳҜSubscribeдёҚдјҡзӯүеҫ…е®ғе®ҢжҲҗгҖӮ - Charles Mager
@CharlesMager 啊,就这么简单!非常感谢。 - Andrew Stephens
@CharlesMager 这会创建一个 async void,这不是推荐的解决方案。 - Karel Kral
2个回答

3

目前的Prism实现不支持在这里查看

但我找到了Prism的EventAggregator的另一种实现,可以允许async订阅。请参见这里

这个新的事件异步聚合器重载可以与原始聚合器以相同的方式使用:

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


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

事件处理程序:

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

我们如何包含这些类?似乎没有Nuget包,而仅仅将必要的文件粘贴到我的解决方案中会导致类冲突。 - DirtyNative
我下载了Prism源代码,并替换了上面源代码中的文件。这不是一个理想的解决方案,因为没有NuGet包。 - Karel Kral

2

只是回复 @Charles Mager 的答案

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

1
它会从这个lambda方法创建async void方法吗?这不是不推荐的吗? - Emy Blacksmith
1
不,这不是一个好的解决方案。它可以工作,但它是一种“点火并忘记”的风格。没有捕获任何异常。 - Karel Kral

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接