2012-01-19 6 views
1

Reactive Extensions(NuGetのメインブランチ)をテストしていますが、Mergeにいくつか問題があります。私は複数のオペレーションを並行して実行しており、すべてのオペレーションが完了したときに通知を受けたいと思っていますが、それだけではわかりません。ここでMerge and onCompleted - すべての並列操作が完了したときの通知方法

は、私がWebクライアントを使用してWebページをダウンロードして、ワード数を計算私の運転です:

private IObservable<int> GetWebsiteWordCount(Uri uri) 
    { 
     var client = new WebClient(); 

     var o = Observable.FromEventPattern<DownloadStringCompletedEventArgs>(client, "DownloadStringCompleted") 
        .ObserveOn(Scheduler.ThreadPool) 
        .Select(newString => newString.EventArgs.Result.Split(' ').Length); 

     client.DownloadStringAsync(uri); 

     return o; 
    } 

私は、これらの多くを作成しています:私は使用

 var tasks = new List<IObservable<int>>() 
         { 
          GetWebsiteWordCount(new Uri("http://www.google.com", UriKind.Absolute)), 
          GetWebsiteWordCount(new Uri("http://www.bing.com", UriKind.Absolute)), 
          GetWebsiteWordCount(new Uri("http://www.yle.fi", UriKind.Absolute)) 
         }; 

れた後、合併してこれらを組み合わせて、すべてが完了したら通知を受けよう:

 tasks.Merge() 
      .ObserveOn(SynchronizationContext.Current) 
      .Subscribe(x => Debug.WriteLine(x), ex => Debug.WriteLine("exception thrown"), 
         () => Debug.WriteLine("all ready")); 

これらの「タスク」のすべてが正しく実行されていると私は予想通りの単語は、デバッグウィンドウにカウントを取得:

14279 
672 
292 

しかし、私は、「すべての準備」のメッセージを得ることはありません。私は何が欠けているすべてのアイデア?

更新:

 var result = from i in tasks.ToObservable() 
        from r in i 
        select r; 

     result.Sum().Subscribe(x => Debug.WriteLine("all ready. sum: " + x)); 

をしかし、私は戻って結果を得たことはありません。代わりにマージ

の合計を使用するには、私はまた、これにマージを変更しようとしました。

アップデート:今ギデオンEngelberthに

おかげでマージし、和・オプションの作業の両方を取るの問題を修正。解決策は、テイク(1)を加えることによりGetWebsiteWordCount-方法を修正することでした:それはより多くのイベントは存在しません時に知る方法がないよう

private IObservable<int> GetWebsiteWordCount(Uri uri) 
    { 
     var client = new WebClient(); 

     var o = Observable.FromEventPattern<DownloadStringCompletedEventArgs>(client, "DownloadStringCompleted") 
        .ObserveOn(Scheduler.ThreadPool) 
        .Select(newString => newString.EventArgs.Result.Split(' ').Length) 
        .Take(1); 

     client.DownloadStringAsync(uri); 

     return o; 
    } 

答えて

2

Observable.FromEventPatternは完了しません。この特定のイベントがイベント非同期パターンであることを知っているので、それは1回だけトリガする必要があります。これを観測可能にするには、GetWebsiteWordCountのどこかに.Take(1)を追加してください。

+0

ありがとうございました!今それは動作します:) –

関連する問題