c# - 使用 System.Reactive.Linq 订阅第一个事件发生并取消

标签 c# system.reactive

给定由事件流构成的 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/

相关文章:

c# - 使用 Rx 订阅进度事件并在完成时仍然获得结果

c# - 我如何使用 XmlTextReader 读取保管箱上的 xml 文件

c# - 获取文件扩展名前最后 6 个字符的正则表达式

c# - 使用 RX (Reactive Extensions) 创建 20 个延迟 30 毫秒的事件

.net - 是否有一个响应式框架主题可以缓冲直到不需要为止?

c# - Observable.ObserveOn() 似乎没有效果

c# - IObservable 按下的键

c# - 以编程方式检查构建配置

c# - 如何在 winform 右上角单击(红色 X)按钮退出应用程序

c# - 数据绑定(bind)到异构列表