2017-01-11 2 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()', не так ли? – Jordi

Смежные вопросы