【发布时间】:2013-12-25 02:31:06
【问题描述】:
我知道有很多关于 async/await 的问题,但我找不到任何答案。
遇到了不明白的地方,请看下面的代码:
void Main()
{
Poetry();
while (true)
{
Console.WriteLine("Outside, within Main.");
Thread.Sleep(200);
}
}
async void Poetry()
{
//.. stuff happens before await
await Task.Delay(10);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Inside, after await.");
Thread.Sleep(200);
}
}
显然,在 await 运算符上,控件返回给调用者,而正在等待的方法在后台运行。 (假设一个 IO 操作)
但是在控制权返回给 await 操作符后,执行变为并行,而不是(我的期望)保持单线程。
我希望在“延迟”完成后,线程将被强制返回 Poetry 方法,从它离开的地方继续。
它的作用。对我来说奇怪的是,为什么“主要”方法一直在运行?那是一根线从一根跳到另一根吗?还是有两个并行线程?
这不是线程安全问题吗?
我觉得这很令人困惑。我不是专家。谢谢。
【问题讨论】:
-
我也建议阅读这个......msdn.microsoft.com/en-us/magazine/jj991977.aspx
-
在控制台模式应用程序中没有任何机制可以继续在同一线程上运行。这需要一个同步提供程序,而您没有。一个 GUI 应用程序有一个,它“泵送消息循环”。您可以看到这不可能工作的最明显方法是查看您的主线程正在做什么。它在睡觉。睡着时无法执行代码。
标签: c# asynchronous async-await