在多线程应用程序中,理解执行流程至关重要。当遇到神秘的“await”关键字时,开发人员经常会遇到这样的问题:“哪个线程在“await”之后协调代码的恢复?”
考虑以下代码片段:
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
假设这段代码在单线程应用程序中运行,它会变得令人困惑:如果线程是,'await'关键字后面的代码如何执行被“task.Wait()”锁定?
答案在于“await”关键字的复杂行为。它将控制权交还给调用者,允许其他异步操作继续进行。 “等待”任务的延续(“等待”之后的代码)被安排在符合当前同步上下文的线程上执行。
在这种情况下,如果“MyMethod()”函数在 UI 线程上执行,“await”之后的代码也将在 UI 线程上执行一次“MyOtherAsyncMethod()”完成。
但是,需要注意的是,不能保证用于延续的确切线程。在多线程应用程序中,延续可以在线程池中的任何可用线程上执行。但是,同步上下文确保“await”之后的代码以与原始线程一致的方式执行。
在给定的示例中,通过调用“task.Wait()”,主线程线程将无限期地被阻塞,从而阻止继续执行。为了避免这种情况,应该正确等待异步操作而不阻塞主线程。
以上是在多线程应用程序中,什么线程在'await”关键字之后执行代码?的详细内容。更多信息请关注PHP中文网其他相关文章!