Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用void AsyncMethod(Action<;T>;callback)模式为异步调用使用Rx框架_C#_Asynchronous_System.reactive - Fatal编程技术网

C# 使用void AsyncMethod(Action<;T>;callback)模式为异步调用使用Rx框架

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(

我已经看过很多关于如何在Rx框架中使用Observable.FromAsyncPattern()来简化异步调用的示例,但是我使用的接口没有使用IAsyncResult BeginXXX/EndXXX(IAsyncResult)的标准异步模式,所以这对我来说不起作用

我使用的库以回调模式公开异步函数:

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也返回一个列表,如果调用方需要将其展平,他可以使用。谢谢我想这正是我想要的。尽管保罗·贝特的答案也很有效。两种方法可以破解同一个螺母。