作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想异步做一些事情,不关心结果。
最好的方法是什么?
Public Async Function HandlerForSomeEvent() As Task
'This is where I do stuff
'Then this is stuff I want to do without waiting for it
DoStuff()
'Here I continue doing other stuff
End Function
Async Sub DoStuff()
'Doing stuff while the handler continues doing it's stuff
End Sub
'VS
Async Function DoStuff() As Task
'Doing stuff while the handler continues doing it's stuff
End Function
每个人都告诉我使用Function As Task
,但由于我不等待它,所以我总是在 VS 中收到烦人的警告。
有什么区别,我为什么要这样做?
最佳答案
使用返回 Task
的 Function
而不是 Async Sub
的主要原因有两个。首先是异常处理。如果你这样做,你会得到一个未捕获的异常,这将终止你的应用程序:
Public Sub Main()
Try
DoSomethingAsync()
Catch ex As Exception
Console.WriteLine(ex)
End Try
End Sub
Private Async Sub DoSomethingAsync()
Throw New Exception()
End Sub
异常不会被 Try/Catch block 捕获,因为它是在单独的线程上抛出的。
但是,如果您这样做,它将被捕获并处理:
Public Async Sub Main()
Try
Await DoSomethingAsync()
Catch ex As Exception
Console.WriteLine(ex)
End Try
End Sub
Private Async Function DoSomethingAsync() As Task
Throw New Exception()
End Sub
第二个重要原因是,即使您现在可能不需要它,但以后可能会需要它。如果它已经是一个返回任务的函数,那么您可以按照自己的意愿使用它。如果你不这样做,你就不能等待它,或者安排它之后发生的事情,或者中止它,或者做任何你可以用任务做的其他事情。所以,真正的问题不是“为什么要这样做?”,而是“为什么不这样做?”
例如,输出“Here”后跟“Done”:
Public Sub Main()
DoSomethingAsync()
Threading.Thread.Sleep(5000)
Console.WriteLine("Done")
End Sub
Public Async Function DoSomethingAsync() As Task
Console.WriteLine("Here")
End Function
正如其他人所提到的,为了避免警告,您可以将任务分配给这样的变量:
Public Sub Main()
Dim t As Task = DoSomethingAsync()
Threading.Thread.Sleep(5000)
Console.WriteLine("Done")
End Sub
它的工作方式相同,并且在自己的线程上运行,就像 Async Sub
一样。 Task
变量是否超出范围也没关系。该任务将继续运行,即使没有任何内容引用它。例如:
Public Sub Main()
DoSomething()
Threading.Thread.Sleep(5000)
Console.WriteLine("Really Done")
End Sub
Public Sub DoSomething()
Dim t As Task = DoSomethingAsync()
Console.WriteLine("Done Doing Something")
End Sub
Public Async Function DoSomethingAsync() As Task
Console.WriteLine("Here")
End Function
关于vb.net - Async Sub() 或 Async Function() 作为即发即弃的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54672010/
我是一名优秀的程序员,十分优秀!