【问题标题】: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 抱怨其中没有等待的两种方法,而不是有等待的主要方法。

标签: c# asynchronous visual-studio-2012 async-await c#-5.0


【解决方案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() 在另一个线程上运行它。
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 2016-03-25
    • 2017-10-09
    • 2023-03-10
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多