【问题标题】:Not all code paths return a value in lambda expression并非所有代码路径都在 lambda 表达式中返回值
【发布时间】:2021-01-16 02:00:58
【问题描述】:

这是我的代码:

var policy = Policy
              .Handle<HttpRequestException>()
              .RetryAsync(1);

HttpResponseMessage httpResponse = null;
await policy.ExecuteAsync(async () =>
{
 httpResponse = await _graphClient.HttpProvider.SendAsync(batchRequest);
});

这很好用。我将代码修改为:

var policy = Policy
              .Handle<HttpRequestException>()
              .OrResult<HttpResponseMessage>(r => r.StatusCode == (HttpStatusCode)429)
              .RetryAsync(1);

然后它返回此错误:

并非所有代码路径都在 Func&lt;Task&lt;HttpResponseMessage&gt;&gt; 类型的 lambda 表达式中返回值

【问题讨论】:

  • 请在您配置policy 的位置发布您的整个函数 - 以及整个 编译器错误消息。我认为编译错误在另一行。你重建了吗?
  • @user989988 你只需要在你的ExecuteAsync的委托末尾添加以下语句:return httpResponse;

标签: c# lambda polly


【解决方案1】:

简而言之,要让 Polly 能够检查返回值,您需要返回一些东西 ¯\_(ツ)_/¯

示例

httpResponse = await policy.ExecuteAsync(async () 
    => await _graphClient.SendAsync(new HttpRequestMessage()));
     // ^ this is now returning a HttpResponseMessage

更长的故事

ExecuteAsync签名的区别如下

// this just expects a task, which can be supplied with an async lamda
public Task ExecuteAsync(Func<Task> action)

与使用OrResult&lt;HttpResponseMessage&gt;时相比

// this expects a task<T> and needs a return value
public Task ExecuteAsync(Func<Task<HttpResponseMessage>> action)

或者换个说法

在您的原始代码中,您只是将 HttpResponse 消息设置为 lambda 的副作用,这使得 ExecuteAsync 解析为重载签名 Func&lt;Task&gt; action

await policy.ExecuteAsync(async () =>
{
    httpResponse = await _graphClient.HttpProvider.SendAsync(batchRequest);
});

但是,当您使用OrResult&lt;HttpResponseMessage&gt; 时,没有这样的重载,这是有道理的。如果您不提供结果,Polly 将无法检查结果。

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 2021-11-08
    • 2013-10-06
    • 2016-02-14
    相关资源
    最近更新 更多