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

BCA*_*BCA 1 .net c# system.reactive

目前我有这样的事情:

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));  
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常。但是,同一个类中发生了一个事件,我需要取消超时;它不应该等待整整 10 秒。

我该怎么做呢?

Yac*_*sad 5

你可以这样做:

假设您在名为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));
Run Code Online (Sandbox Code Playgroud)

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

var observable2 = Observable.FromEventPattern<OtherEventEventArgs>(
            h => this.OtherEvent += h,
            h => this.OtherEvent -= h);
Run Code Online (Sandbox Code Playgroud)

TakeUntil然后通过使用如下方法组合两个 Observable 来创建另一个 Observable :

var new_observable = observable1.TakeUntil(observable2);
Run Code Online (Sandbox Code Playgroud)

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