【发布时间】:2012-07-27 21:08:51
【问题描述】:
我有一个正在处理的任务列表(启用驱动器、更改位置、等待停止、禁用)。
“等待”监控我想要等待的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的顺序是否正确? (我认为他们是)
【问题讨论】:
-
你不应该也处理
source出错或完成的情况吗? -
@svick,嗯,好问题。在我的特定用例中,我正在观察
Repeat,所以我认为这不会完成。但确实,如果我希望这个扩展是可重用的,我应该处理这些情况。
标签: c# task-parallel-library system.reactive