当等待传递到异步lambda表达式的函数中时,异步方法缺少等待操作员警告

时间:2019-03-10 08:31:51

标签: c# asynchronous lambda async-await

我有以下异步方法,如果发生故障,这是一个更简单的等待和重试:

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()的最新代码有什么缺点吗?

0 个答案:

没有答案