【发布时间】:2013-07-11 02:23:50
【问题描述】:
我有一个IObservable<T> 类型的序列和一个将T, CancellationToken 映射到Task<U> 的函数。从他们那里获得IObservable<U> 的最干净的方法是什么?
我需要以下语义:
- 每个任务在前一个项目的任务完成后开始
- 如果任务已被取消或出错,则会被跳过
- 严格保留原始序列的顺序
这是我看到的签名:
public static IObservable<U> Select<T, U> (
this IObservable<T> source,
Func<T, CancellationToken, Task<U>> selector
);
我还没有写任何代码,但除非有人打败我,否则我会写。
无论如何,我不熟悉像Window 这样的运算符,所以我的解决方案可能不太优雅。
我需要 C# 4 中的解决方案,但为了比较,也欢迎 C# 5 答案。
如果你好奇,下面是我的真实场景,或多或少:
Dropbox.GetImagesRecursively ()
.ObserveOn (SynchronizationContext.Current)
.Select (DownloadImage)
.Subscribe (AddImageToFilePicker);
【问题讨论】:
-
哇,我刚刚意识到
SelectMany具有完全相同的签名。唉,它不会等待任务完成。 -
我认为一般来说,忽略异常是个坏主意。他们至少应该被记录下来,或者类似的东西。
-
@svick:你说得对,我会在第一次实施后修改这个设计。
标签: c# .net asynchronous task-parallel-library system.reactive