【问题标题】:Task.Run() difference for awaitable Task等待任务的 Task.Run() 差异
【发布时间】:2022-01-14 21:23:26
【问题描述】:

我一直在试图找出两者之间的区别。

Task.Run(() => DoSomething());

 Task.Run(async() => await DoSomething());

我一直在测试它,它看起来不会影响功能。如果你想运行一项任务,我真的很困惑使用哪一个。我正在调用等待任务,这只是一个语法糖,还是它们之间有区别。我应该使用哪一个,为什么?我真的很好奇,因为即使我将该任务存储在一个变量中,它仍然会为这两种情况返回一个任务。

我们还有异步方法

   private async Task DoSomething()
        {
     //do something here
        }

我在这里找到了一篇很棒的帖子await Task.Run vs await 解释在 GUI 应用程序的事件处理程序中等待异步方法的具体情况,但这仅解释了这之间的区别

await Task.Run(async () => await LongProcessAsync());

还有这个

await LongProcessAsync();

【问题讨论】:

  • 事实上,你根本不需要 lambda:Task.Run(DoSomething); 很好,因为 DoSomething 会像 lambda 一样隐式转换为 Func<Task>
  • 您好@JohnathanBarclay,感谢您的评论,如果我使用 Task.Run(DoSomething); 时收到 VS 代码警告的原因是否相同;警告是“由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将 'await' 运算符应用于调用结果”
  • 你必须写await Task.Run(DoSomething)
  • @Vladimir 警告与委托无关;它将是从Task.Run 返回的Task。这个example 会显示警告,即使使用了 lambda。

标签: c# asynchronous async-await


【解决方案1】:

Lambda 表达式在底层创建私有方法。所以这个:

Task.Run(() => DoSomething());

变成这样:

Task.Run(__lambda);
private Task __lambda() => DoSomething();

所以,问一下这两行有什么区别:

Task.Run(() => DoSomething());
Task.Run(async() => await DoSomething());

同问这两种方法有什么区别:

private Task __lambda() => DoSomething();
private async Task __lambda() => await DoSomething();

我有a blog post that goes into detail。总结的答案是,如果 all 您正在做的只是调用DoSomething,那么您可以省略(删除)asyncawait 关键字。如果 lambda 正在执行为简单起见从您的问题中删除的其他任何操作(例如,修改参数),那么我建议保留 asyncawait 关键字。

作为一般准则:任何琐碎的代码都可以省略async/await;任何逻辑都应该使用asyncawait

【讨论】:

  • 感谢@Stephen Cleary
猜你喜欢
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2014-03-18
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多