C# 当等待在传递给异步lambda表达式的函数中时,异步方法缺少等待运算符警告

C# 当等待在传递给异步lambda表达式的函数中时,异步方法缺少等待运算符警告,c#,asynchronous,lambda,async-await,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 {

我有以下异步方法,这是一种在失败时更简单的等待和重试方法:

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);
        }
    }
}
由于传递给RetryAsync方法的函数不包含任何wait,因此显然会得到警告:

此异步方法缺少“await”运算符,将同步运行。 考虑使用“Acess”操作符等待非阻塞API调用, 或“wait Task.Run(…)”在后台线程上执行CPU限制的工作

。。。将调用代码更改为此可以解决问题:

await RetryAsync(async () => {
    await Task.Run(() => _newID = myDBFunction(););
}, 300);
除了使用Task.Run()之外,还有其他方法可以实现这个简单案例的并行性吗?使用Task.Run()的最新代码有什么缺点吗?

首先,我建议使用。它得到了广泛的应用和测试,并且对异步和同步使用具有本机支持

但如果您想继续使用自己的,可以添加一个同步等效项:

public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public void Retry(Action _action, int _ms = 1000, int _counter = 3);
如果希望始终将同步代码放在线程池中,可以为此添加重载,以:

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);
首先,我建议使用。它得到了广泛的应用和测试,并且对异步和同步使用具有本机支持

但如果您想继续使用自己的,可以添加一个同步等效项:

public async Task RetryAsync(Func<Task> _action, int _ms = 1000, int _counter = 3);
public void Retry(Action _action, int _ms = 1000, int _counter = 3);
如果希望始终将同步代码放在线程池中,可以为此添加重载,以:

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

如果实际上不是
async
,为什么需要传递
async
方法?因为在大多数情况下,传递的都是异步方法,而且我确实希望实现并行性。这很好,您有
Func
签名,但实现不一定是
async
。你可以像你说的那样,只使用
任务。运行
而不使用
await
async
-这有什么问题吗?@OfirWinegarten,请写下你将如何调用或如何更改重试函数。我不会更改
RetryAsync
,只需删除
async
await
<代码>等待RetryAsync(()=>Task.Run(()=>\u newID=myDBFunction()),300)
如果实际上不是
async
,为什么需要传递
async
方法?因为在大多数情况下,它将传递的是一个异步方法,而且我确实希望实现并行性。这很好,您有
Func
签名,但实现不一定是
async
。你可以像你说的那样,只使用
任务。运行
而不使用
await
async
-这有什么问题吗?@OfirWinegarten,请写下你将如何调用或如何更改重试函数。我不会更改
RetryAsync
,只需删除
async
await
<代码>等待RetryAsync(()=>Task.Run(()=>\u newID=myDBFunction()),300)
await RetryAsync(() => {
    _newID = myDBFunction();
}, 300);