使用异步而不等待

Posted

技术标签:

【中文标题】使用异步而不等待【英文标题】:Using async without await 【发布时间】:2012-08-14 12:55:00 【问题描述】:

我想让函数异步,所以我只需像这样添加async

public async static void something()

你可以看到它的返回类型是void。我只想异步调用这个函数而不阻塞,因为返回是void,所以不需要await

但是 Visual Studio 2012 无法编译这个,它说我想念await

您能否提供一个不使用await 来创建函数async 的示例。

【问题讨论】:

更有趣的是async Methods correct? Resharper warning,当 Resharper 对 async 方法发出警告时,其正文中包含 await @ГеннадийВанинНовосибирск,在那个问题中,Resharper 抱怨其中没有等待的两种方法,而不是有等待的主要方法。 【参考方案1】:

改成

public async Task something()
  return await Task.Factory.StartNew(() => 
      //TODO:
  

您不必等待返回的任务;)

所以或者你可以只使用一个任务并删除 async 和 await 然后你得到:

public Task something()
  return Task.Factory.StartNew(() => 
      //TODO:
  

如果你不使用泛型返回类型参数,任务是隐式无效的

【讨论】:

【参考方案2】:

我认为您可能误解了async 的作用。警告是完全正确的:如果您标记您的方法async 但不在任何地方使用await,那么您的方法不会是异步的。如果调用它,方法内的所有代码都会同步执行。

另外,您应该尽量避免使用async void 方法,它们会使处理异常变得困难。

【讨论】:

async 在方法被调用时是否使方法本身异步,如果方法内部没有await?如上示例,如果我调用something(),它会阻塞当前线程吗? 是的,如果您在something() 中有一些长时间运行的代码(并且没有await),那么它将阻塞线程。这就是警告试图告诉你的。 async 不会让你的方法神奇地不阻塞。如果你想在另一个线程上运行一些代码,请使用Task.Run() 哦,明白了,我误解了演唱会,异步标记方法将使用异步调用并不意味着它本身就是异步的。 @Patrick 然后你可以使用Task.Run() 在另一个线程上运行它。

以上是关于使用异步而不等待的主要内容,如果未能解决你的问题,请参考以下文章

等待异步函数完成而不添加回调

按值返回值而不等待所有值返回异步 C#

忽略异步而不等待编译警告

如何在.NET中调用异步函数而不等待它[重复]

如何从同步方法调用中回调而不等待它?

承诺等待得到解决而不返回