You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:35:58