タイプのシーケンス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);