Reactive Extensions订阅呼叫等待

时间:2014-07-19 17:22:21

标签: c# async-await system.reactive

我想根据Reactive Extensions Observable提出的每个事件执行异步调用。我也试图让所有内容保持同步,因为我希望在处理下一个事件之前完成异步调用。

如何进行类似以下的操作?我说类似,因为下面的代码无法编译。

settingsChangedInMemory
    .Subscribe(async _ => {
        var settings = Extract();
        await SaveSettings(settings);
    });

我不确定它是否会改变任何东西,但我需要订阅多个Observable。例如,像这样的另一个订阅。

settingsChangedOnDisk
    .Subscribe(async _ => {
        var settings = await ReadSettings(settings);
        Apply(settings);
    });

您如何使用Reactive Extensions执行此操作?

2 个答案:

答案 0 :(得分:16)

怎么样:

settingsChangedInMemory
    .SelectMany(async _ => await SaveSettings(Extract()))
    .Subscribe(x => Apply(x));

永远不要将async放在Subscribe中,而是始终要将其放在SelectMany中。

答案 1 :(得分:1)

您可以使用Reactive Extensions(Rx)2.0中发布的新ForEachAsync方法,如下所示:

await observable
    .ForEachAsync(async x =>
    {
        Console.WriteLine(x);
        await Task.Delay(1000);
    });

ForEachAsync返回Task<T>,当observable完成时,它会完成。我的博客文章here或反应扩展团队blog post的更多信息。