在处理了C#的async / await模式一段时间之后,我突然意识到我不太了解如何解释以下代码中发生的情况:
async void MyThread()
{
while (!_quit)
{
await GetWorkAsync();
}
}
GetWorkAsync()
假定返回一个等待对象Task
,该等待对象在执行继续操作时可能会或可能不会导致线程切换。
如果等待不在循环内,我不会感到困惑。我自然希望该方法的其余部分(即延续)可以在另一个线程上执行,这很好。
但是,在一个循环中,“其余方法”的概念让我有些迷惑。
如果线程是在连续状态下打开的,而线程没有被打开,那么“其余的循环”会怎样?在哪个线程上执行循环的下一个迭代?
我的观察表明(未最终验证),每个迭代都在同一线程(原始线程)上开始,而延续在另一个线程上执行。真的可以吗?如果是,那么这是否是某种程度的意外并行性,需要解决GetWorkAsync方法相对于线程安全性的问题?
更新:我的问题并非如某些人所建议的重复。该while (!_quit) { ... }
代码模式仅仅是我的实际代码的简化。实际上,我的线程是一个长寿命的循环,它以固定的时间间隔(默认为每5秒)处理其工作项的输入队列。实际的退出条件检查也不是示例代码所建议的简单的字段检查,而是事件句柄检查。