将轮询Web服务转换为RX

 WINNIE双双围脖_370 发布于 2023-02-04 14:14

鉴于:

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 UpdateWeather()
    {
        var weatherData = await _weatherDataProvider.GetWeather();
        return weatherData;
    }
}

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

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

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

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

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

1 个回答
  • 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();
        }
    }
    

    ObserveOnDispatcher 在nuget包rx-xaml中.

    2023-02-04 14:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有