给定由事件流构成的 IObservable 序列:
IObservable<MyEvent> observable = EventAggregator.GetEvent<MyEvent>()
我得到第一个事件发生:
MyEvent myEvent = await observable.FirstOrDefaultAsync();
但是,我想分别处理订阅。当用户单击取消按钮时中断可观察。
目前我使用 .ToTask() 扩展方法的解决方法,但我相信有一个仅基于 Rective 扩展的更清晰的解决方案。
_tsc = new CancellationTokenSource();
MyEvent myEvent;
try
{
myEvent = await EventAggregator.GetEvent<MyEvent>()
.FirstOrDefaultAsync()
.ToTask(__tsc.Token);
}
catch (TaskCanceledException)
{
myEvent = null;
}
void Cancel()
{
_tsc.Cancel();
}
最佳答案
使用内置的 Rx 运算符,您想要做的事情非常简单。
只需这样做:
IObservable<MyEvent> observable = EventAggregator.GetEvent<MyEvent>()
var endItAll = new Subject<Unit>();
MyEvent myEvent = await observable.TakeUntil(endItAll).FirstOrDefaultAsync();
现在您只需调用 endItAll.OnNext(Unit.Default)
即可结束订阅并返回 null
MyEvent
。
关于c# - 使用 System.Reactive.Linq 订阅第一个事件发生并取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43367206/