如果您在不在线程池中的线程中等待,会发生什么情况?
What happens if you await in a thread that isn't in the thread pool?
如果我像这样创建一个新线程:
Thread thread = new Thread(.....);
thread.Start(......);
如果该线程中的方法使用 await
运算符会怎样?
我知道在正常情况下,这会导致 .Net 保存当前执行的状态并将线程返回给线程池,这样它就可以在我们等待等待的方法完成时处理其他事情,但是如果这个不是在线程池线程中开始吗?
如果你“创建”了线程,你就“管理”了它。
一旦调度到该线程上 运行 的代码完成,该线程将被销毁。
如果您 运行 在您创建的线程上编写 async/await 代码,您很可能很快就会 运行 离开该线程并付出创建和销毁的代价线程没有任何好处。
线程池用于调度短期代码,async/await 是常态。
如果您有一些阻塞的长 运行ning 代码,那么最好创建您自己的线程。
I understand that in a normal scenario this would cause .Net to save the state of the current execution and give the thread back to the thread pool so it can work on something else while we wait for the awaited method to complete, but what if this is not in a thread pool thread to begin with?
到clarify a bit,await
会保存本地状态然后return。它不会立即放弃线程。
因此,在这种情况下,如果 Thread
的主要方法 returns,则该线程退出。它不会 return 进入线程池,因为它不是线程池线程;它只是退出,因为它的线程 proc returned.
还有其他场景:
- 如果线程是 UI 线程,则它 return 进入其消息循环。该线程保持 运行ning,正在处理其他消息。
- 如果该线程是控制台应用程序的主线程,则它会退出,从而导致控制台应用程序退出。
What happens if a method inside that thread uses the await operator?
和其他时间一样await
使用:
await
捕获“上下文”(SynchronizationContext.Current
或 TaskScheduler.Current
)。在这种情况下,上下文将是线程池上下文。
- 当方法准备好恢复时,它会在该上下文中恢复。
所以在这种情况下,await
将 return,导致线程退出。然后稍后,该方法的其余部分将 运行 在线程池线程上。
如果我像这样创建一个新线程:
Thread thread = new Thread(.....);
thread.Start(......);
如果该线程中的方法使用 await
运算符会怎样?
我知道在正常情况下,这会导致 .Net 保存当前执行的状态并将线程返回给线程池,这样它就可以在我们等待等待的方法完成时处理其他事情,但是如果这个不是在线程池线程中开始吗?
如果你“创建”了线程,你就“管理”了它。
一旦调度到该线程上 运行 的代码完成,该线程将被销毁。
如果您 运行 在您创建的线程上编写 async/await 代码,您很可能很快就会 运行 离开该线程并付出创建和销毁的代价线程没有任何好处。
线程池用于调度短期代码,async/await 是常态。
如果您有一些阻塞的长 运行ning 代码,那么最好创建您自己的线程。
I understand that in a normal scenario this would cause .Net to save the state of the current execution and give the thread back to the thread pool so it can work on something else while we wait for the awaited method to complete, but what if this is not in a thread pool thread to begin with?
到clarify a bit,await
会保存本地状态然后return。它不会立即放弃线程。
因此,在这种情况下,如果 Thread
的主要方法 returns,则该线程退出。它不会 return 进入线程池,因为它不是线程池线程;它只是退出,因为它的线程 proc returned.
还有其他场景:
- 如果线程是 UI 线程,则它 return 进入其消息循环。该线程保持 运行ning,正在处理其他消息。
- 如果该线程是控制台应用程序的主线程,则它会退出,从而导致控制台应用程序退出。
What happens if a method inside that thread uses the await operator?
和其他时间一样await
使用:
await
捕获“上下文”(SynchronizationContext.Current
或TaskScheduler.Current
)。在这种情况下,上下文将是线程池上下文。- 当方法准备好恢复时,它会在该上下文中恢复。
所以在这种情况下,await
将 return,导致线程退出。然后稍后,该方法的其余部分将 运行 在线程池线程上。