使用async而不使用await

36

我想让一个函数变成异步的,所以我简单地添加了 async,就像这样:

public async static void something(){
}
你可以看到这个函数的返回类型是void,我只想异步地调用它而不会阻塞,因为返回值是void,所以不需要await
但是Visual Studio 2012不能编译它,它说我漏掉了await
请提供一个示例,使一个函数成为async而不使用await

更有趣的是,当Resharper在其主体中具有await的异步方法发出警告时,async Methods correct? Resharper warning - Gennady Vanin Геннадий Ванин
@ГеннадийВанинНовосибирск,在那个问题中,Resharper抱怨两个方法中没有await,而不是主方法,主方法中有await。 - Matt Smith
2个回答

39

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

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


10
"async"(异步)并不能神奇地使您的方法不阻塞。如果您想在另一个线程上运行某些代码,请使用 "Task.Run()"。 - svick
8
哦,我明白了,我误解了这场音乐会,异步标记的方法是要使用异步调用,并不意味着它本身是异步的。 - Eric Yin
我还是很困惑。我想要设置一个异步函数,不考虑返回值或其他任何东西,只需继续执行,就好像什么都没发生一样。你的意思是省略await会把它变成普通的函数调用吗?我不想等待它,我只想让它运行并完成任务,然后在完成后停止。 - Patrick
2
@Patrick 然后你可以使用 Task.Run() 在另一个线程上运行它。 - svick
@svick,没错,await并不意味着不阻塞。但是,除非在某个时候它被用于避免阻塞(例如通过不等待和异步void方法),否则异步语言特性就没有任何价值。您建议使用Task.Run(),我同意,这证明了整个C#异步特性在其当前形式下基本上是无用/不完整的。这就像软件版的“皇帝的新装”。 - user2534096
显示剩余4条评论

-1

改成

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

你不必等待任务返回 ;)

因此,您可以使用一个任务并删除async和await,然后您会得到:

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

如果您不使用通用的返回类型参数,则任务为 implicit void。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接