1

我试图并行调用 2 个 httpwebrequest 并让它们在使用 Rx 扩展完成后调用相同的回调。但我不知道如何实现这一点..这是我的代码:

    private static IObservable<Stream> GetImage(string path)
    {
        var uri = new Uri(path);
        var thumburi = new Uri(path + "_thumb.jpg");
        return Observable.Create<Stream>(o =>
                                                  {
                                                        var request = (HttpWebRequest) HttpWebRequest.Create(uri);
                                                        var readComplete =
                                                          Observable.FromAsyncPattern<WebResponse>(
                                                              request.BeginGetResponse,
                                                              request.EndGetResponse)();
                                                        var subscription = readComplete
                                                          .Select(e => e.GetResponseStream())
                                                          .Subscribe(o);



                                                      return subscription;

                                                  });
    }
4

4 回答 4

1

使用最新的位和 .Net 4.5,您可以执行以下操作:

private static IObservable<byte[]> GetImages(string path)
{
    var sources = new Uri[]
    {
        var uri = new Uri(path),
        var thumburi = new Uri(path + "_thumb.jpg")
    };

    var obs = from uri in sources.ToObservable()
              from data in Observable.Using(
                   () => new WebClient(),
                   client => client.DownloadDataTaskAsync(uri).ToObservable())
              select data;

    return obs;
}

我确实想知道您是否真的只想返回数据流,而不关心哪个流对应于基础,哪个是缩略图。并行发出请求后,您将不再控制它们返回的顺序。如果需要,您可以投影一个包含 uri 和数据流的类型以消除它们的歧义。

于 2012-09-18T20:58:10.357 回答
0

为什么不直接使用 Zip?

GetStream("foo.jpg").Zip(GetStream("bar.jpg"), (foo, bar) => new { foo, bar })
    .Subscribe(fooAndBar => ...);
于 2012-09-19T05:01:07.857 回答
0

我建议这种解决方案。

制作GetImage更通用的用途:

private static IObservable<Stream> GetImage(Uri uri)
{
    return Observable.Create<Stream>(o =>
    {
        var request = (HttpWebRequest)HttpWebRequest.Create(uri);
        var readComplete =
            Observable.FromAsyncPattern<WebResponse>(
                request.BeginGetResponse,
                request.EndGetResponse)();
        var subscription =
            readComplete
                .Select(e => e.GetResponseStream())
                .Subscribe(o);
        return subscription;
    });
}

然后添加一个特定的GetImages方法来查询图像及其拇指:

private static IObservable<Tuple<Uri, Stream>> GetImages(string path)
{
    var uris = new []
    {
        new Uri(path + ".jpg"),
        new Uri(path + "_thumb.jpg"),
    }.ToObservable();

    return
        from uri in uris
        from stream in GetImage(uri)
        select Tuple.Create(uri, stream);
}

我假设您的path变量不能包含“.jpg”扩展名,否则您必须进行一些字符串操作。

现在GetImages返回 aIObservable<Tuple<Uri, Stream>>因为SelectMany不保证流的返回顺序,所以我们需要使用Uri来消除流的歧义。

让我知道这是否适合您。

于 2012-09-19T01:06:45.717 回答
0

我猜你会拉出对两个单独流的异步调用,然后将它们连接起来,不是吗?像这样: http: //leecampbell.blogspot.com/2010/06/rx-part-5-combining-multiple.html

于 2012-09-18T16:40:39.973 回答