i具有以下异步方法,如果失败,这是一个更简单的等待和重试:
public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3) {
while (true) {
try {
await _action();
return; // success!
}
catch {
if (--_counter == 0)
throw;
await Task.Delay(_ms);
}
}
}
to,在理论上,被称为这样的称呼:
await RetryAsync(async () => {
_newID = myDBFunction();
}, 300);
由于该功能传递给 retryasync 方法不包含任何等待,因此显然会引起警告:
这种异步方法缺乏"等待"运算符,并且会同步运行。 考虑使用"等待"操作员等待非阻止API调用, 或"等待任务。
...并将调用代码更改为此解决了问题:
await RetryAsync(async () => {
await Task.Run(() => _newID = myDBFunction(););
}, 300);
除了使用 task.run()之外,还有其他方法可以实现此简单情况下的并行性吗?您在最新代码上看到了任何缺点。 task.run() 首先,我建议使用Polly。它被广泛使用,经过广泛测试,并具有对异步和同步使用的天然支持。 但是,如果您想继续使用自己的同步等效: 可以这样称为: 如果要始终将同步代码放在线程池上,则可以为此添加一个过载,以: 可以这样称为:public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public void Retry(Action _action, int _ms = 1000, int _counter = 3);
Retry(() => {
_newID = myDBFunction();
}, 300);
public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public async Task RetryAsync(Action _action, int _ms = 1000, int _counter = 3) =>
await RetryAsync(() => Task.Run(_action), _ms, _counter);
await RetryAsync(() => {
_newID = myDBFunction();
}, 300);