【发布时间】:2016-10-20 00:20:53
【问题描述】:
我已经阅读了很多关于 await/async 的教程,并且我明白当涉及到 await 关键字时,它会回到 main context 然后回到 await(当它是完成),然后如果在 away 之后在 async 方法中有某些内容,则继续。我还读到有类似ConfigureAwait(False) 之类的东西,这只是意味着与我之前写过的await 相反,此时它不会回到main context,而是会留在这里等待await 完成,然后在 async 方法中继续,之后将返回到 main cotext。所以不同之处在于它不会回到main context,而是等待await。如果我错了,请纠正。基于第一个示例中的知识,我应该看到以下结果:
After DoStafAsync
Done running the long operation asynchronously.
但是当我只是简单地添加 ConfigureAwait(False) 时,它应该是:
Done running the long operation asynchronously.
After DoStafAsync
因为它不会返回上下文,而是会等待,在异步方法完成后会返回。不知何故,我看到了第一个输出中的结果。我错过了什么?
Public Class Form1
Sub LongOperation()
Threading.Thread.Sleep(5000)
End Sub
Private Async Function DoStafAsync() As Task
lblStatus.Text = "Running a long operation asynchronously... (UI thread should be fully responsive)"
Await Task.Run(Sub()
LongOperation()
End Sub).ConfigureAwait(False)
lblStatus.Text = "Done running the long operation asynchronously."
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
dfg
lblStatus.Text = "After DoStafAsync"
End Sub
Async Sub Dfg
Await DoStafAsync
End Sub
End Class
附加问题:有些人声称任务不是在创造 线程,但在同一个 ui 线程上工作。但也有一些人 声称他们是,也有人声称 有时任务创建线程,有时不。什么是真的?
【问题讨论】:
-
Eric Lippert 在这方面写了一些很棒的帖子。 Like this one这个is epic
-
@Plutonix 好的,但我仍然没有在我的代码中看到问题,那么对于第二种情况,任务没有创建踏板?
标签: vb.net