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