.NET中的反应式扩展:如何提前取消Timeout()

本文关键字:取消 何提前 Timeout 反应式 扩展 NET | 更新日期: 2023-09-27 18:19:46

目前我有这样的东西:

await Observable.FromEventPattern<WriteConfirmationEventArgs>(
    h => this.WriteCompleted += h,
    h => this.WriteCompleted -= h)
    .Select(x => x.EventArgs.Id)
    .FirstAsync(x => Guid.Equals(x, dto.Id))
    .Timeout(TimeSpan.FromSeconds(10));  

这似乎很好用。然而,在同一个类中发生了一个事件,我需要取消超时;它不应该等待整整10秒。

我该怎么做?

.NET中的反应式扩展:如何提前取消Timeout()

您可以这样做:

假设您在一个名为observable1(基于WriteCompleted事件)的变量中有第一个Observable。

为了更清楚地说明这一点,以下是observable1:的定义

var observable1 = Observable.FromEventPattern<WriteConfirmationEventArgs>(
    h => this.WriteCompleted += h,
    h => this.WriteCompleted -= h)
    .Select(x => x.EventArgs.Id)
    .FirstAsync(x => Guid.Equals(x, dto.Id))
    .Timeout(TimeSpan.FromSeconds(10));

创建另一个基于其他事件的Observable,如下所示:

var observable2 = Observable.FromEventPattern<OtherEventEventArgs>(
            h => this.OtherEvent += h,
            h => this.OtherEvent -= h);

然后用TakeUntil方法组合两个Observable来创建另一个Observable:

var new_observable = observable1.TakeUntil(observable2);

然后订阅这个新的Observable,而不是observable1