C# 使用void AsyncMethod(Action<;T>;callback)模式为异步调用使用Rx框架
我已经看过很多关于如何在Rx框架中使用Observable.FromAsyncPattern()来简化异步调用的示例,但是我使用的接口没有使用IAsyncResult BeginXXX/EndXXX(IAsyncResult)的标准异步模式,所以这对我来说不起作用 我使用的库以回调模式公开异步函数:C# 使用void AsyncMethod(Action<;T>;callback)模式为异步调用使用Rx框架,c#,asynchronous,system.reactive,C#,Asynchronous,System.reactive,我已经看过很多关于如何在Rx框架中使用Observable.FromAsyncPattern()来简化异步调用的示例,但是我使用的接口没有使用IAsyncResult BeginXXX/EndXXX(IAsyncResult)的标准异步模式,所以这对我来说不起作用 我使用的库以回调模式公开异步函数: void GetAllObjects(Action<List<Object>> callback) 变成这样: var o = Observable.ForkJoin(
void GetAllObjects(Action<List<Object>> callback)
变成这样:
var o = Observable.ForkJoin(
Observable.Start(GetAllUsers()),
Observable.Start(GetAllCustomers()),
Observable.Start(GetAllRules())
).Finally(() => GetAllSystems);
public IObservable<Object> ObserveAllObjects()
{
return Observable.Create<Object>(
observer =>
() => GetAllObjects(objects => objects.ForEach(o => observer.OnNext(o))));
}
IObservable<List<T>> FromListCallbackPattern<T>(
Action<Action<List<T>>> listGetter)
{
return Observable
.Create<List<T>>(observer =>
{
var subscribed = true;
listGetter(list =>
{
if (!subscribed) return;
observer.OnNext(list);
observer.OnCompleted();
});
return () =>
{
subscribed = false;
};
});
}
如何将该模式转换为返回IObservable的模式?尝试
Observable.Create()
,可能类似这样:
var o = Observable.ForkJoin(
Observable.Start(GetAllUsers()),
Observable.Start(GetAllCustomers()),
Observable.Start(GetAllRules())
).Finally(() => GetAllSystems);
public IObservable<Object> ObserveAllObjects()
{
return Observable.Create<Object>(
observer =>
() => GetAllObjects(objects => objects.ForEach(o => observer.OnNext(o))));
}
IObservable<List<T>> FromListCallbackPattern<T>(
Action<Action<List<T>>> listGetter)
{
return Observable
.Create<List<T>>(observer =>
{
var subscribed = true;
listGetter(list =>
{
if (!subscribed) return;
observer.OnNext(list);
observer.OnCompleted();
});
return () =>
{
subscribed = false;
};
});
}
public IObservable ObserveAllObjects()
{
返回可观察的。创建(
观察员=>
()=>GetAllObjects(objects=>objects.ForEach(o=>observer.OnNext(o));
}
我喜欢Observable。为此创建,但@dahlbyk answer不正确(未完成并在取消订阅处理程序中执行操作)。应该是这样的:
var o = Observable.ForkJoin(
Observable.Start(GetAllUsers()),
Observable.Start(GetAllCustomers()),
Observable.Start(GetAllRules())
).Finally(() => GetAllSystems);
public IObservable<Object> ObserveAllObjects()
{
return Observable.Create<Object>(
observer =>
() => GetAllObjects(objects => objects.ForEach(o => observer.OnNext(o))));
}
IObservable<List<T>> FromListCallbackPattern<T>(
Action<Action<List<T>>> listGetter)
{
return Observable
.Create<List<T>>(observer =>
{
var subscribed = true;
listGetter(list =>
{
if (!subscribed) return;
observer.OnNext(list);
observer.OnCompleted();
});
return () =>
{
subscribed = false;
};
});
}
IObservable FromListCallbackPattern(
动作列表(getter)
{
可观测回波
.创建(观察者=>
{
var=true;
listGetter(列表=>
{
如果(!认购)返回;
OnNext观察员(名单);
observer.OnCompleted();
});
return()=>
{
订阅=假;
};
});
}
此外,由于原始API返回一个完整的列表,我认为没有理由过早地将其转换为可观察的。让生成的observable也返回一个列表,如果调用方需要将其展平,他可以使用。谢谢我想这正是我想要的。尽管保罗·贝特的答案也很有效。两种方法可以破解同一个螺母。