Я использую FromEventPattern и хочу иметь возможность выполнить некоторую очистку в блоке finally моего наблюдаемого. Сейчас блок finally не вызывается. Насколько я понимаю, я должен вызвать OnCompleted ... где-то, но не уверен, как это реализовать. Некоторый код из моей программы Silverlight:
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;
}