Mau*_*tti 0 c# asynchronous system.reactive async-await
我在使用阻塞代码时遇到死锁Task.Wait(),等待async内部等待 Rx LINQ 查询的方法。
这是一个例子:
public void BlockingCode()
{
this.ExecuteAsync().Wait();
}
public async Task ExecuteAsync()
{
await this.service.GetFooAsync().ConfigureAwait(false);
//This is the RX query that doesn't support ConfigureAwaitawait
await this.service.Receiver
.FirstOrDefaultAsync(x => x == "foo")
.Timeout(TimeSpan.FromSeconds(1));
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是是否有任何等效的 ConfigureAwait on awaitable IObservable 以确保延续不会在相同的SynchronizationContext.
你必须理解“等待一个 Observable”是什么意思。看看这个。因此,从语义上讲,您的代码
await this.service.Receiver
.FirstOrDefaultAsync(x => x == "foo")
.Timeout(TimeSpan.FromSeconds(1));
Run Code Online (Sandbox Code Playgroud)
相当于
await this.service.Receiver
.FirstOrDefaultAsync(x => x == "foo")
.Timeout(TimeSpan.FromSeconds(1))
.LastAsync()
.ToTask();
Run Code Online (Sandbox Code Playgroud)
(请注意,这里存在某种冗余,调用FirstOrDefaultAsyncandLastAsync但这没问题)。
所以你得到了你的任务(CancellationToken如果有的话,可能需要额外的任务)。您现在可以使用ConfigureAwait.
| 归档时间: |
|
| 查看次数: |
936 次 |
| 最近记录: |