如何使用RxNET发出异步HTTP请求?

时间:2017-08-24 01:39:13

标签: c# system.reactive

目前我在Observable.Create()中使用await。 ExecuteRequestAsync是一个调用HttpClient.GetAsync Method (String)

的包装类
    public IObservable<IList<ExampleResponseModel>> ListExamplesRx()
    {
        return Observable.Create<IList<ExampleResponseModel>>(
            o =>
            {
                try
                {
                    var url = string.Format(Routes.Examples.List);
                    IList<ExampleResponseModel> exampleResponse = await ExecuteRequestAsync<IList<ExampleResponseModel>>(url, HttpMethod.Get);
                    o.OnNext(exampleResponse);
                    o.OnCompleted();
                }
                catch (Exception e)
                {
                    o.OnError(e);
                }
                return Disposable.Empty;
            }
        );
    }

这是最佳做法吗?有没有更合适的rx解决方案?

1 个答案:

答案 0 :(得分:5)

Task<T>.ToObservable()执行您正在寻找的内容:

public IObservable<IList<ExampleResponseModel>> ListExamplesRx()
{
    var url = string.Format(Routes.Examples.List);
    return ExecuteRequestAsync<IList<ExampleResponseModel>>(url, HttpMethod.Get)
        .ToObservable();
}

如果您想要冷可观察(即延迟执行),您可以将上述内容包含在Observable.Defer中。

如果您需要支持取消,请参阅How to create IObservable from Task such that unsubscribing cancels the task?