.NET 中的响应式扩展:如何提前取消 Timeout()?
Reactive Extensions in .NET: How can one cancel a Timeout() early?
目前我有这样的东西:
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));
这似乎工作正常。但是,在同一个class中发生了一个事件,我需要取消超时;它不应该等待整整 10 秒。
我该怎么做?
你可以这样做:
假设您在名为 observable1
的变量中拥有第一个 Observable(基于 WriteCompleted
事件)。
为了更清楚地说明,这里是 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
目前我有这样的东西:
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));
这似乎工作正常。但是,在同一个class中发生了一个事件,我需要取消超时;它不应该等待整整 10 秒。
我该怎么做?
你可以这样做:
假设您在名为 observable1
的变量中拥有第一个 Observable(基于 WriteCompleted
事件)。
为了更清楚地说明,这里是 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