使用异步而不等待
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()
在另一个线程上运行它。以上是关于使用异步而不等待的主要内容,如果未能解决你的问题,请参考以下文章