【问题标题】:Async method lacks await operators warning when the await is in a function passed to an async lambda expresion当等待在传递给异步 lambda 表达式的函数中时,异步方法缺少等待运算符警告
【发布时间】:2019-03-10 08:31:50
【问题描述】:

我有以下异步方法,在失败的情况下更简单的等待和重试:

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

到,理论上,这样称呼:

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

【问题讨论】:

  • 为什么要传递async方法,如果实际上不是async
  • 因为在大多数情况下它将是一个异步方法,它将被传递,而且我确实想实现并行性。
  • 没关系,你有你的Func&lt;Task&gt; 签名,但实现不必是async。你可以如你所说,只使用Task.Run 而不使用awaitasync - 那有什么问题?
  • @OfirWinegarten,请写下您将如何拨打电话或如何更改重试功能。
  • 我不会更改RetryAsync,只需删除asyncawaitawait RetryAsync(() =&gt; Task.Run(() =&gt; _newID = myDBFunction()), 300);

标签: c# asynchronous lambda async-await


【解决方案1】:

首先,我推荐使用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);

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 2012-10-25
    • 2017-04-30
    • 1970-01-01
    • 2019-08-27
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多