将轮询 Web 服务转换为 RX [英] Convert Polling Web Service to RX

查看:27
本文介绍了将轮询 Web 服务转换为 RX的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给定:

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;
    }
}

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

I'm puzzling how to convert this use Reactive Extensions. I started with:

var weather = Observable.FromAsync(_weatherDataProvider.GetWeather);

但是当我进入投票环节时:

But when I got to the polling part:

Observable.Timer(new TimeSpan(0, 15, 0)).Subscribe(weather);

没有泛型重载.我想我知道我需要生成一个序列,但由于某种原因我无法弄清楚.

There is no generic overload. I think I get the idea that I need to generate a sequence but I just can't puzzle it out for some reason.

推荐答案

Observable.Interval 带有 Select 投影是关键.像这样:

Observable.Interval with a Select projection is the key. Something like this:

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 中.

ObserveOnDispatcher is in nuget package rx-xaml.

这篇关于将轮询 Web 服务转换为 RX的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆