我使用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;
}
见我的回答类似的问题: http://stackoverflow.com/questions/3801505/使用rx-to-simplify-an-asynchronous-silverlight-web-service-request/3808990#3808990 – 2012-01-05 14:26:33