Kev*_*vin 3 vb.net asynchronous winforms async-await
我想了解async/await.我知道你不应该等待一个受CPU限制的方法,但是为了帮助我理解我很好奇如果你这样做会发生什么.考虑:
Public Async Function DoSomeTasks()
Await LongRunningCPUBoundMethod1()
LongRunningCPUBoundMethod2()
End Function
Public Async Function LongRunningCPUBoundMethod1() As Task
' Do stuff synchronously
End Function
Public Sub LongRunningCPUBoundMethod2()
' Do stuff synchronously
End Sub
Run Code Online (Sandbox Code Playgroud)
Task Scheduler如何处理CPU资源?这些方法将以什么顺序执行?LongRunningCPUBoundMethod1或LongRunningCPUBoundMethod2会先执行吗?
这里要记住的是Async/ Awaitcode不一定是多线程的.您可以通过等待启动单独线程的项来使用它们来帮助处理多线程代码,但它们真正做的是允许您在同一个线程中有效地分解多个任务.
这不是没有一些开销; 在异步任务之间切换会产生成本.当你等待cpu绑定任务时,你已经将这个成本添加到已经cpu密集的工作中,因此使事情变得更糟而不是更好.但是,如果将此与在单独线程中启动cpu-heavy任务的代码相结合,然后使用WaitHandle或Task将结果发送回来,您可能会再次使用(取决于您正在等待相关项目的数量)到可用内核的数量),因为现在你正在利用CPU中的多个内核.
另外,让我们在.Net WinForms的上下文中看一下.重要的是要记住,你永远不想在主UI线程上做大量的CPU工作.实际上,任何阻塞超过几毫秒的东西都是有问题的.如果该线程忙,Windows消息泵不运行,您无法响应事件,并且您的用户界面变得无法响应.
要理解Await这一点,请将其视为将方法分解为两个部分(如果存在多个部分,则更多Await).所有直到并包括Await直接运行的行,以及await之后的所有内容都被编译器隐藏在一个新的回调方法(称为延续)中,该方法将使用相同的上下文(包括原始方法的本地变量)调用完成后在同一个线程中Await.
有了这些信息,应该很清楚,如果您直接Await使用cpu绑定方法,那么您仍然会在UI线程上立即执行该工作,并且您的用户界面仍然存在问题.但是,您可以通过在其自己的线程中启动cpu-bound方法来解决此问题.Await与Tasks 一起使用,无需编写大量新代码即可轻松完成.当然它比旧DoEvents()技术好得多.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |