2011-12-13 64 views
0

我使用FromEventPattern,我希望能夠做一些清理工作,我觀察到的finally塊。現在finally塊沒有被調用。這是我的理解,我不得不打電話給OnCompleted ...某處,但不知道如何實現。從我的Silverlight程序的某些代碼:爲什麼最後不會調用我的DownloadStringAsync Observable?

public IObservable<string> StartDownload (string uri) 
    { 
     WebClient wc = new WebClient(); 
     var o = Observable.FromEventPattern<DownloadStringCompletedEventArgs>(wc, "DownloadStringCompleted") 
          .Select(s => s.EventArgs.Result); 
     wc.DownloadStringAsync(new Uri(uri)); 

    return o; 
    } 



    public void TestRx() 
    { 
    var anobs = StartDownload("http://www.google.com"); 

    anobs 
     .Subscribe(stuff => 
     { 
      // do stuff 
     }); 

    anobs 
     .Finally(() => 
     { 
      // not called? 
     }); 
    } 

UPDATE: 顯然,我的假設是OnCompleted()將解決我的問題是錯誤的。我嘗試將StartDownload更改爲以下內容,最後仍未調用。這裏發生了什麼?

public IObservable<string> StartDownload (string uri) 
    { 
    WebClient wc = new WebClient(); 

    var subject = new AsyncSubject<string>(); 

    wc.DownloadStringCompleted += (sender, e) => 
    { 
     if (e.Error != null) 
      subject.OnError(e.Error); 

     subject.OnNext(e.Result); 
     subject.OnCompleted(); 
    }; 

    wc.DownloadStringAsync(new Uri(uri));   

    return subject; 
    } 
+0

見我的回答類似的問題: http://stackoverflow.com/questions/3801505/使用rx-to-simplify-an-asynchronous-silverlight-web-service-request/3808990#3808990 – 2012-01-05 14:26:33

回答

1

你需要寫你的訂閱代碼:

anobs 
    .Finally(() => 
     { 
     // will now be called. ;-) 
     }) 
    .Subscribe(stuff => 
     { 
     // do stuff 
     }); 

Finally調用返回一個新的觀察到的是「追加」到anobs觀察的 - 當然這並不能實際修改anobs觀察到在所有。如果您直接訂閱anobs,它不知道有關Finally調用的任何信息,因此無法調用。

+0

好吧,那麼有效!應該注意的是,這隻能與OnCompleted調用時更新的StartDownload函數結合使用。 – kbeal2k 2011-12-14 15:28:38

0

請記住,Rx操作符與LINQ操作符完全相同,因爲它們實際上不會執行任何操作,直到您執行了「ForEach」操作(即評估它)。在Rx中,Subscribe就像ForEach。 Enigmativity在這裏糾正了(但我想進一步爲爲什麼他是正確的解釋了一下!)

相關問題