2017-01-11 8 views
1

イベントからObservableを作成するためにこのメソッドを作成しました。私が開始されたダウンロードするとき、私は、ダウンロードプロセスをキャンセルするために、ユーザーのボタンを提供したいと思います、しかしリアクティブ観測を使用してダウンロードをキャンセルする

private void BuildObservables(WebClient webClient) 
{ 
    Observable.FromEventPattern<AsyncCompletedEventHandler, AsyncCompletedEventArgs>(h => webClient.DownloadFileCompleted += h, h => webClient.DownloadFileCompleted -= h) 
     .Select(ep => ep.EventArgs) 
     .Subscribe(
      a => 
      { 
       this.WizardViewModel.PageCompleted() 
      }, 
     ); 

    Observable.FromEventPattern<DownloadProgressChangedEventHandler, DownloadProgressChangedEventArgs>(h => webClient.DownloadProgressChanged += h, h => webClient.DownloadProgressChanged -= h) 
     .Select(ep => ep.EventArgs) 
     .Subscribe(
      a => 
      { 
       this.progressEdit.Position = a.ProgressPercentage; 
       progressEdit.Update(); 
      } 
     ); 
} 

:私は、プログレスバーがファイルをダウンロードし、更新しようとしています。

このコードに基づいてこのキャンセルを追加するにはどうすればよいですか?

答えて

1

WebClientには、CancelAsyncという方法があります。

限りRxが行くように、あなたがダウンロードをキャンセルすることはできませんが、効果的に将来のアップデートを無視して意味のサブスクリプション、を処分することができますので、

async Task Main() 
{ 
    var webClient = new WebClient(); 
    var dummyDownloadPath = @"C:\temp\temp.txt"; 
    var disposable = BuildObservables(webClient); 
    webClient.DownloadFileAsync(new Uri(@"http://google.com"), dummyDownloadPath); 
    await Task.Delay(TimeSpan.FromMilliseconds(100)); 
    disposable.Dispose(); 
} 
private IDisposable BuildObservables(WebClient webClient) 
{ 
    var downloadSubscription = Observable.FromEventPattern<AsyncCompletedEventHandler, AsyncCompletedEventArgs>(
     h => webClient.DownloadFileCompleted += h, 
     h => webClient.DownloadFileCompleted -= h 
    ) 
     .Select(ep => ep.EventArgs) 
     .Subscribe(
      a => 
      { 
       Console.WriteLine("Download completed."); 
//    this.WizardViewModel.PageCompleted() 
      } 
     ); 

    var progressSubscription = Observable.FromEventPattern<DownloadProgressChangedEventHandler, DownloadProgressChangedEventArgs>(
      h => webClient.DownloadProgressChanged += h, 
      h => webClient.DownloadProgressChanged -= h 
     ) 
     .Select(ep => ep.EventArgs) 
     .Subscribe(
      a => 
      { 
       Console.WriteLine("Download Percent complete:" + a.ProgressPercentage); 
       //    this.progressEdit.Position = a.ProgressPercentage; 
       //    progressEdit.Update(); 
      } 
     ); 
     return new CompositeDisposable(downloadSubscription, progressSubscription); 
} 
+0

は、私の知る限りは、図のようにできましたまず、 'webClient.CancelAsync()'を実行してから、 'disposable.Dispose()'を使ってobservableを破棄してください。 – Jordi

関連する問題