gpt4 book ai didi

使用 ConfigureAwait(false) 的 C# async/await 链接

转载 作者:太空狗 更新时间:2023-10-29 17:39:06 25 4
gpt4 key购买 nike

基于大量书籍和博客,包括 this excellent one here ,很明显,当一个人编写一个公开辅助异步方法的 dll 库时,即包装方法,通常认为最好的做法是在线程池线程上内部完成实际异步方法的 I/O 任务,如下所示(如下所示的伪代码为简洁起见,我使用 HttpClient 作为示例)

public Async Task<HttpResponseMessage> MyMethodAsync(..)
{
...
var httpClient = new HttpClient(..);
var response = await httpClient.PostAsJsonAsync(..).ConfigureAwait(false);
...
return response;
}

这里的关键是 ConfigureAwait(false) 的使用,这样 IO 任务完成发生在线程池线程而不是原始线程上下文,从而潜在地防止死锁。

我的问题是站在来电者的角度。我对调用者和上述方法调用之间存在多层方法调用的场景特别感兴趣,如以下示例所示。

CallerA -> Method1Async -> Method2Async -> finally the above MyMethodAsync

仅在 final方法上设置 ConfigureAwait(false) 是否足够,还是应该确保 Method1AsyncMethod2Async 也在内部调用它们使用 ConfigureAwait(false) 的异步方法?将它包含在所有这些中间方法中似乎很愚蠢,尤其是如果 Method1AsyncMethod2Async 只是最终调用 MyMethodAsync 的重载。有什么想法,请赐教!

更新示例因此,如果我有一个包含以下私有(private)异步方法的库,

private async Task<string> MyPrivateMethodAsync(MyClass myClass)
{
...
return await SomeObject.ReadAsStringAsync().ConfigureAwait(false);
}

我是否应该确保以下公共(public)重载方法都包含 ConfigureAwait(false),如下所示?

public async Task<string> MyMethodAsync(string from)
{
return await MyPrivateMethodAsync(new (MyClass() { From = from, To = "someDefaultValue"}).ConfigureAwait(false);
}
public async Task<string> MyMethodAsync(string from, string to)
{
return await MyPrivateMethodAsync(new (MyClass() { From = from, To = to }).ConfigureAwait(false);
}

最佳答案

绝对不是。 ConfigureAwait 顾名思义配置await。它只影响与其耦合的 await

ConfigureAwait 实际上返回一个不同的等待类型,ConfiguredTaskAwaitable 而不是 Task,后者又返回一个不同的等待类型 ConfiguredTaskAwaiter 而不是 TaskAwaiter

如果您想忽略所有 awaitSynchronizationContext,您必须为它们中的每一个使用 ConfigureAwait(false)

如果您想限制 ConfigureAwait(false) 的使用,您可以在最顶部使用我的 NoSynchronizationContextScope(请参阅 here):

async Task CallerA()
{
using (NoSynchronizationContextScope.Enter())
{
await Method1Async();
}
}

关于使用 ConfigureAwait(false) 的 C# async/await 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com