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)
没有通用的重载.我想我认为我需要生成一个序列,但我出于某种原因无法解开它.
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();
}
}
Run Code Online (Sandbox Code Playgroud)
ObserveOnDispatcher 在nuget包rx-xaml中.
| 归档时间: |
|
| 查看次数: |
946 次 |
| 最近记录: |