gpt4 book ai didi

c# - 使用 transient 故障处理重试异步操作

转载 作者:行者123 更新时间:2023-11-30 21:43:57 25 4
gpt4 key购买 nike

我正在使用 Topaz block 实现对 Azure 调用的重试处理。我已经实现了自定义指数退避重试策略。但是,我无法理解这之间的区别:

  var result = await RetryPolicy.ExecuteAsync(async () => await SomeAsyncOperation());

对比

var result = await RetryPolicy.ExecuteAsync( () => SomeAsyncOperation());

根据文档,RetryPolicy.ExecuteAsync 将重复执行异步任务,直到满足重试策略,因此第一个解决方案似乎是正确的,因为它等待异步操作的结果。但是,我已经尝试了两种方法,它们的工作原理似乎相似。我也看过例子 like this onethis one 对于第二种情况。哪一个是正确的?

最佳答案

这是在代码中引入冗余等待的一种非常普遍的现象。

例子:简而言之,我们正在看这样的东西。

 public Task ExecuteAsync(Func<Task> taskAction)
{
return taskAction();
}

(1) await ExecuteAsync( () => Task.Delay(5000));

vs :

(2) await ExecuteAsync( async () => await Task.Delay(5000));

(1) 中,您正在等待您传递给重试策略的委托(delegate)创建的任务。

(2) 中你正在等待一个不同的任务,一个多余的任务,您内心的 await 等待您在 (1) 中等待的任务,当您调用 ExecuteAsync 时,会创建一个不同的任务供您等待。

之所以有效,是因为您的代码行为相同,它仍在等待 ExecuteAsync 返回的任务。它只是通过创建一个额外的任务(没有充分的理由)来完成一些更繁重的工作。

RetryPolicy.cs

ExecuteAsync.cs

这里的寓意是等待您打算完成的任务。

此外:

那里有很多防御性的冗余 await,但也有一些是至关重要的,看起来像是多余的。

例如:

接受这个读操作在异步(例如 I/O)操作完成之前,不应释放连接。

  await DoSomeReadingAsync();

public async Task DoSomeReadingAsync()
{
using(var connection = new Connection())
{
await SomeReadOperationAsync(connection);
}
}

如果你返回内部任务而不等待它在这里,它将是destorus因为连接将在内部异步操作完成之前被释放。

  await DoSomeReadingAsync();

public Task DoSomeReadingAsync()
{
using(var connection = new Connection())
{
return SomeReadOperationAsync(connection);
}
}

关于c# - 使用 transient 故障处理重试异步操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41174375/

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