鉴于:
public partial class Weather { private readonly DispatcherTimer _timer = new DispatcherTimer(); private readonly IWeatherDataProvider _weatherDataProvider; public Weather(IWeatherDataProvider weatherDataProvider) { InitializeComponent(); _weatherDataProvider = weatherDataProvider; Loaded += async (sender, args) => { _timer.Interval = new TimeSpan(0, 15, 0); _timer.Tick += async (o, eventArgs) => DataContext = await UpdateWeather(); _timer.Start(); DataContext = await UpdateWeather(); }; Unloaded += (sender, args) => _timer.Stop(); } private async TaskUpdateWeather() { var weatherData = await _weatherDataProvider.GetWeather(); return weatherData; } }
我很困惑如何转换这个使用Reactive Extensions.我开始时:
var weather = Observable.FromAsync(_weatherDataProvider.GetWeather);
但是当我到达投票部分时:
Observable.Timer(new TimeSpan(0, 15, 0)).Subscribe(weather);
没有通用的重载.我想我认为我需要生成一个序列,但我出于某种原因无法解开它.
Observable.Interval
用Select
投影是关键.像这样的东西:
public class Weather { private readonly IWeatherDataProvider _weatherDataProvider; private CompositeDisposable disposables = new CompositeDisposable(); public Weather(IWeatherDataProvider weatherDataProvider) { InitializeComponent(); _weatherDataProvider = weatherDataProvider; Loaded += (sender, args) => { var weather = Observable.Interval(TimeSpan.FromMinutes(15)) .SelectMany(_ => weatherDataProvider.GetWeather().ToObservable()) .ObserveOnDispatcher() .Subscribe(data => DataContext = data); disposables.Add(weather); }; Unloaded += (sender, args) => disposables.Dispose(); } }
ObserveOnDispatcher
在nuget包rx-xaml中.