如何在Func<string>委托中使用await调用异步方法?
能不能在Func里用await调用异步方法?
答案是不行。Func<string>是同步委托类型,它的返回值是同步的string,没办法在里面使用await关键字——要想用await,委托必须是异步类型,也就是Func<Task<string>>。
要实现你想要的写法,得做这两处修改:
- 把传入
CacheManager.Get的委托改成异步lambda,同时确保CacheManager有对应的异步重载方法(比如GetAsync,大多现代缓存库都支持异步)。 - 把
GetBearerToken方法改成异步方法,返回Task<string>,因为整个逻辑现在是异步的了。
修改后的代码示例:
private static async Task<string> GetBearerToken() { return await CacheManager.GetAsync<string>( "DirectConnectApi_BearerToken", async () => { var response = await _directConnectTokenApi.Post<DirectConnectTokenResponse>().ConfigureAwait(false); return response.result.Token; }); }
为什么原来的写法不推荐?
你之前用.GetAwaiter().GetResult()的方式是同步阻塞异步方法,这种写法很容易引发死锁(比如在有同步上下文的环境里,线程会等待异步操作完成,但异步操作又需要同步上下文才能继续执行)。用await的异步写法才是正确的异步处理方式,既能避免死锁,又能更好地利用线程资源。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

