2017-01-11 2 views
2

Я создал этот метод, чтобы создать Observable от событий. Я пытаюсь загрузить файл и обновлять индикатор:onCompleted и onNext не достигнуто

private void BuildObservables(WebClient webClient) 
{ 
    Observable.FromEventPattern<AsyncCompletedEventHandler, AsyncCompletedEventArgs>(h => webClient.DownloadFileCompleted += h, h => webClient.DownloadFileCompleted -= h) 
     .Select(ep => ep.EventArgs) 
     .Subscribe(
      _ => 
      { 
       //stuff code 
      }, 
      _ => this.WizardViewModel.PageCompleted() <<<<< (*) NOT REACHED 
     ); 

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

Я был направлен вверх, что (*) точка отмечена на источник (onCompleted и onNext) не достигается.

Любые идеи?

ответ

2
  • Ваш OnCompleted обработчик фактически OnError обработчик. OnCompleted лямбды не принимать аргумент, использовать () => ... вместо _ => ..., чтобы поразить правильную перегрузку - но это все равно не поможет, потому что:

  • Даже когда устранена, OnCompleted не срабатывает. FromEventHandler не привязывает события .NET к OnCompleted - нет значимого преобразования. Для полного понимания, почему это так, см. Мой ответ в How to use Observable.FromEvent instead of FromEventPattern and avoid string literal event names. В вашем случае обработчик OnNext - это то, что вы хотите в любом случае.

  • Событие OnNext, безусловно, срабатывает для меня в простом тестовом приложении, загружающем «www.google.com», разрешаете ли вы время для событий перед тем, как приложение завершится? Вы вызываете BuildObservables перед вызовом DownloadXXXAsync - если нет, вы можете не пропускать события? Если это не поможет, можете ли вы предоставить минимальный полностью рабочий репрограмм, демонстрирующий проблему?

+1

A. .Take (1) 'должен вызывать« OnCompleted ». – Enigmativity

+0

Это правда. Это не меняет того факта, что базовое событие .NET не имеет эквивалентного представления «завершения», но оно, безусловно, может быть полезно для очистки ресурсов в наблюдаемых цепочках, когда вы знаете, что ищете ровно одно событие. –