我有以下异步方法,如果发生故障,这是一个更简单的等待和重试:
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 方法的函数不包含任何 await ,因此显然会得到警告:
此异步方法缺少“等待”运算符,将同步运行。 考虑使用“ await”运算符来等待非阻塞API调用, 或“ await Task.Run(...)”在后台线程上执行CPU绑定工作。
...并将调用代码更改为此可解决问题:
await RetryAsync(async () => {
await Task.Run(() => _newID = myDBFunction(););
}, 300);
除了使用 Task.Run()之外,还有其他方法可以实现这种简单情况的并行性吗?您看到上面带有 Task.Run()的最新代码有什么缺点吗?