将轮询 Web 服务转换为 RX [英] Convert Polling Web Service to RX
本文介绍了将轮询 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屋!
查看全文