作業中のタスクのリストがある状況にあります (ドライブを有効にする、位置を変更する、停止を待つ、無効にする)。
「待機」は、IObservable<Status>
待機したい を監視します (そのためContinueWith
、他のタスクをスレッド化できます)。
サブスクライバーの OnNext 処理内で次のタスクを開始しましたが、それは見苦しかったです。私が今思いついたのは、この拡張メソッドです:
public static Task<T> WaitFor<T>(this IObservable<T> source, Func<T, bool> pred)
{
var tcs = new TaskCompletionSource<T>();
source
.Where(pred)
.DistinctUntilChanged()
.Take(1) //OnCompletes the observable, subscription will self-dispose
.Subscribe(val => tcs.TrySetResult(val),
ex => tcs.TrySetException(ex),
() => tcs.TrySetCanceled());
return tcs.Task;
}
( svickの取り扱いの提案でOnCompleted
更新OnError
)
質問:
- これは良いですか、悪いですか、それとも醜いですか?
- これを行うことができた既存の拡張機能を見逃しましたか?
Where
とDistinctUntilChanged
の順序は正しいですか? (私は彼らだと思います)