微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Polly ExecuteAsync 的 lambda 表达式中包含多行代码块?

如何解决如何在 Polly ExecuteAsync 的 lambda 表达式中包含多行代码块?

我有使用 Polly 策略 (ExecuteAsync()) 上的 IAsyncPolicy<HttpResponseMessage> 方法从网页中提取数据的工作代码。我想向它添加一些调试日志记录,但到目前为止,我无法找出正确的语法来实现这种情况,除非我将日志记录和 http 调用都包装在一个单独的方法中,然后通过 {{ 1}}。

这对我来说似乎不“正确”,我觉得有一种更简洁或更直接的方法。我认为我的问题是我对 ExecuteAsync 和 lambda 表达式如何真正运作以实现这一点没有足够的理解,因为当我将东西包装在 Func<T> 中时,我得到如下错误:>

并非所有代码路径都返回 {} 类型的 lambda 表达式中的值。

这是我原来的工作代码

Func<CancellationToken,Task<HttpResponseMessage>>

代码产生“并非所有代码路径都返回 var httpClient = _httpClientFactory.CreateClient(); HttpResponseMessage result; var retryPolicy = (IAsyncPolicy<HttpResponseMessage>)_policyRegistry[RetryPolicyKeyName]; result = await retryPolicy.ExecuteAsync( async cancellationToken => await httpClient.GetAsync(myUrl,cancellationToken),cancellationToken ); 类型的 lambda 表达式中的值错误

Func<CancellationToken,Task>

这是我的“hack”,用额外的方法完成了我想要的:

var httpClient = _httpClientFactory.CreateClient();
HttpResponseMessage result;
var retryPolicy = (IAsyncPolicy<HttpResponseMessage>)_policyRegistry[RetryPolicyKeyName];

result = await retryPolicy.ExecuteAsync(
    async cancellationToken =>    
    {
        await httpClient.GetAsync(myUrl,cancellationToken);
    },cancellationToken
);

解决方法

这里有什么:

result = await retryPolicy.ExecuteAsync(
    await httpClient.GetAsync(managementUrl,cancellationToken),cancellationToken
);

相当于:

result = await retryPolicy.ExecuteAsync(async () => {
      return await httpClient.GetAsync(managementUrl,cancellationToken);
    },cancellationToken
);

因此这将在 lambda 中执行不止一行:

result = await retryPolicy.ExecuteAsync(async () => {
      _logger.LogDebug("Requesting from: {managementUrl}",managementUrl);
      return await httpClient.GetAsync(managementUrl,cancellationToken
);

..虽然我不太清楚 managementUrl 如何在您的示例中演变为 myUrl 以及它们是否不同.. 我假设不会>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。