我有几个异步API,它们使用回调或事件而不是async。我成功地使用TaskCompletionSource对它们进行了as described here包装。
现在,我想使用一个返回IObservable<T>并产生多个对象的接口。我读到了关于.NET的Rx,这似乎是一条可行的道路。然而,我在犹豫是否要包含另一个依赖项和另一个新的范式,因为我已经在这个应用程序中使用了很多对我来说都很新的东西(比如XAML、MVVM、C#的async/await)。
有没有类似于包装单个回调IObservable<T>的方法来包装API?我想这样调用API:
foreach (var t in GetMultipleInstancesAsync()) {
var res = await t;
Console.WriteLine("Received item:", res);
}发布于 2019-12-29 18:11:37
如果可观察对象发出多个值,则可以将它们转换为Task<T>,然后将它们添加到任何IEnumerable结构中。
检查IObservable ToTask。正如这里所讨论的,可观察对象必须在等待之前完成,否则可能会有更多的值。
This guide here might do the trick for you too
public static Task<IList<T>> BufferAllAsync<T>(this IObservable<T> observable)
{
List<T> result = new List<T>();
object gate = new object();
TaskCompletionSource<IList<T>> finalTask = new TaskCompletionSource<IList<T>>();
observable.Subscribe(
value =>
{
lock (gate)
{
result.Add(value);
}
},
exception => finalTask.TrySetException(exception),
() => finalTask.SetResult(result.AsReadOnly())
);
return finalTask.Task;
}发布于 2019-12-29 18:14:33
如果你想使用Rx,那么你可以使用你的返回列表:
GetMultipleInstancesAsync().ToObservable().Subscribe(...);您可以订阅OnCompleted/OnError处理程序。
你也可以把它包装成一个任务列表:
var result = await Task.WhenAll(GetMultipleInstancesAsync().ToArray());所以你得到了一个结果数组,你就完成了。
https://stackoverflow.com/questions/59518323
复制相似问题