2011-12-13 44 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在这里纠正了(但我想进一步为为什么他是正确的解释了一下!)

相关问题