将轮询Web服务转换为RX

Mik*_*ard 2 c# system.reactive

鉴于:

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 Task<WeatherData> UpdateWeather()
    {
        var weatherData = await _weatherDataProvider.GetWeather();
        return weatherData;
    }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑如何转换这个使用Reactive Extensions.我开始时:

var weather = Observable.FromAsync(_weatherDataProvider.GetWeather);
Run Code Online (Sandbox Code Playgroud)

但是当我到达投票部分时:

Observable.Timer(new TimeSpan(0, 15, 0)).Subscribe(weather);
Run Code Online (Sandbox Code Playgroud)

没有通用的重载.我想我认为我需要生成一个序列,但我出于某种原因无法解开它.

Jam*_*rld 6

Observable.IntervalSelect投影是关键.像这样的东西:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

ObserveOnDispatcher 在nuget包rx-xaml中.