【问题标题】:Starting a task when an Observable ticks and merge results (using Rx.NET)当 Observable 打勾并合并结果时启动任务(使用 Rx.NET)
【发布时间】:2019-03-11 12:14:26
【问题描述】:

我想知道是否可以在每次 Observable 滴答声时启动一个任务,并使用这些任务的结果继续管道。结果的顺序无关紧要。我正在使用 C#。

linksObservable
    .Select(url=> downloadTask(url))
    ...

上面的代码将启动任务以下载 url,但我如何获得可用的结果(即 downloadTask 已完成)。另一个考虑因素是来自任务的Exceptions。任何异常都不应影响其余任务。

【问题讨论】:

  • 只是想知道linksObservable.Select(url=> Observable.Return(await downloadTask(url))).Switch() 是否是答案。
  • 没有。在并发任务的情况下,Switch 将取消较早的任务。如果您将 Switch 替换为 Merge 将起作用,并且相当于彼得的答案。

标签: task observable system.reactive


【解决方案1】:

好吧,如果 downloadTask 返回你可以做的事情

observable
    .SelectMany(url => downloadTask(url))
    .Subscribe(result => Console.WriteLine(result));

完整示例:

void Main()
{
    var observable = new Subject<string>();

    observable
        .SelectMany(url => downloadTask(url))
        .Subscribe(result => Console.WriteLine(result));

    observable.OnNext("a");
    observable.OnNext("b");
    observable.OnNext("c");
    observable.OnNext("d");
}

public async Task<string> downloadTask(string s)
{
    await Task.Delay(1000);
    return s;
}

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多