配置等待 IObservable<T>

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.

Dan*_*ber 5

你必须理解“等待一个 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.