好哥哥因为没有搞清楚同步完成和异步完成导致代码死循环了这档事
有个好哥哥说他遇到循环代码死循环的问题,所以仔细的研究了一下,于是发现了关于同步完成和异步完成的区别。
什么是死循环
比如,长这个样子
[Test]
public void EndlessLoop()
{
Yanjia_foRever_niCE();
Console.WriteLine("nice end"); // it will never reach here
return;
void Yanjia_foRever_niCE()
{
do
{
Thread.Sleep(100); // some code running synchronously
Console.WriteLine("严架 nice");
} while (GetBool());
return;
bool GetBool()
{
return true;
}
}
}
❌ 这段代码一但开始运行,将不会结束,也不会打印 nice end
。
因为 Yanjia_foRever_niCE
这个方法是一个死循环,永远不会结束。
那如果 GetBool()
返回 Task<bool>
呢
比如,长这个样子
[Test]
public void EndlessLoopWithSyncCompletion()
{
Yanjia_foRever_niCE();
Console.WriteLine("nice end"); // it will never reach here
return;
async Task Yanjia_foRever_niCE()
{
do
{
Thread.Sleep(100); // some code running synchronously
Console.WriteLine("严架 nice");
} while (await GetBoolAsync());
return;
Task<bool> GetBoolAsync()
{
return Task.FromResult(true);
}
}
}
❌ 这个代码,看起来用了 Task 但是依然是一个死循环。因为 GetBoolAsync
返回的是一个 Task,但它是一个同步完成的 Task。所有的操作都会在当前线程完成,不会切换到其他线程。