2012-04-13 6 views
1

Используя наблюдаемое событие, я загружаю последнюю погоду из веб-службы. Я тестировал это на телефоне и эмуляторе дома, и он отлично работает. Я привёл проект со мной на работу и запустил его с помощью эмулятора. Теперь я не уверен, что это брандмауэр или что-то, но, похоже, он не получает погоду, он просто сидит там навсегда, пытаясь. Поэтому мне казалось, что если это когда-нибудь случится на телефоне, мне нужен какой-то тайм-аут, потому что если он не сможет заставить погоду сказать 10-15 секунд, тогда просто сдавайтесь.Как правильно определить время наблюдения?

Вот пример кода до сих пор

IObservable<IEvent<MyWeather.GetWeatherCompletedEventArgs>> observable = 
      Observable.FromEvent<MyWeather.GetWeatherCompletedEventArgs>(Global.WeatherService, "MyWeather.GetWeatherCompleted").Take(1); 

     observable.Subscribe(w => 
     { 

      if (w.EventArgs.Error == null) 
      { 
       // Do something with the weather 
      } 
     }); 

     Global.WeatherService.GetWeatherAsync(location); 

Как я могу получить это время благополучно по истечении заданного времени, если ничего не происходит?

ответ

0

Как насчет Observable.Timeout? Он должен делать то, что вы хотите, или?

observable.Subscribe(w => ...).Timeout(TimeSpan.FromSeconds(10)).Catch<>(...); 
+0

Я не могу вспомнить, где я его читал, но я слышал, что использование Timeout - это не лучшая вещь для использования, поскольку это вызывает исключения и другие проблемы. – Gaz83

1

Вы должны использовать FromEventPattern (не FromEvent), поэтому я изменил ваш наблюдаема:

var observable = 
     Observable 
     .FromEventPattern<MyWeather.GetWeatherCompletedEventArgs>(
      Global.WeatherService, 
      "MyWeather.GetWeatherCompleted") 
     .Take(1); 

Вы могли бы сделать это:

var timeout = 
    Observable 
     .Timer(TimeSpan.FromSeconds(10.0)) 
     .Select(_ => (EventPattern<MyWeather.GetWeatherCompletedEventArgs>)null); 

observable 
    .Amb(timeout) 
    .Subscribe(w => 
    { 
     if (w != null && w.EventArgs.Error == null) 
     { 
      // Do something with the weather 
     } 
    }); 
+0

Observable.FromEventPattern, похоже, не вариант .FromAsyncPattern, .FromAsyncPattern <> и .FromEvent <> – Gaz83

+0

Извините, я думал, что вы подключаетесь к стандартным событиям? Вы получаете события args, правильно? – Enigmativity

+0

Если вы ссылаетесь на стандартное событие, как на его основе на основе отправителя и события, то да, это так. – Gaz83

-1

Попробуйте использовать Защелка в C#

http://www.itdevspace.com/2009/05/c-latch-implementation.html

+0

Вы имели в виду использовать для отладки? Я не вижу, как это может быть полезно. – Vitalij

+0

Это очень не рекомендуется. Используйте TPL, если нужно. – Asti

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