var*_*ble -1 c# asynchronous async-await
在按钮单击事件中说我有:
await someFn()
Run Code Online (Sandbox Code Playgroud)
在someFn代码中,我有一些同步代码和一些异步代码。
根据有关此主题的在线阅读,他们似乎都说await遇到时,控制立即返回调用者(在这种情况下为 UI 线程),同时发生异步等待。
我还没有遇到过解释async在等待函数中的代码之前有一些同步代码时会发生什么的情况。同步代码是否在将控件传递给调用者(UI 线程)之前执行?
我知道 - 如果它是使用await Task.Run(...)而不是运行await someFn(),它将在单独的线程中执行。
确实,“当遇到等待时,控制立即返回调用者”,条件是等待不会在该await点完成。否则(如果 awaitable 已经完成)控件将保留在方法内,通过立即执行await.
这就是影响await运算符行为的全部内容:IsCompleted等待者属性的结果。产生等待的方法是否包含同步代码并不重要。在await不知道,也不关心。内部的同步代码块someFn确实会对应用程序的响应能力产生影响,但这与await. 要了解原因,以更冗长但等效的形式重写代码可能会有所帮助。这个:
await someFn();
Run Code Online (Sandbox Code Playgroud)
...相当于:
Task t = someFn();
await t;
Run Code Online (Sandbox Code Playgroud)
应用程序的 UI 会因为someFn()块而不是块而冻结await t。当然,除非您创建了一些类似于任务的可等待类型,IsCompleted否则在调用其等待器的属性时会阻塞。
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |