当等待的功能传递给异步lambda的功能中,异步方法缺乏等待运营商警告



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);

最新更新