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

最新のビットと.Net4.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

この種の解決策を提案します。

より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でaを返します。そのため、を使用してストリームの曖昧性を解消する必要があります。IObservable<Tuple<Uri, Stream>>SelectManyUri

これがあなたのために働くかどうか私に知らせてください。

于 2012-09-19T01:06:45.717 に答える
0

2 つの別々のストリームへの非同期呼び出しを引き出してから、それらを連結すると思いますよね? このように: http://leecampbell.blogspot.com/2010/06/rx-part-5-combining-multiple.html

于 2012-09-18T16:40:39.973 に答える
0

Zipだけを使用しないのはなぜですか?

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