IAm*_*sed 3 .net c# multithreading asynchronous async-await
我正在尝试理解async/await并阅读了大量文章,但我仍然对同步/异步性质感到困惑.
我有以下测试控制台应用程序:
static void Main(string[] args)
{
var test = FooAsync();
Console.WriteLine("After FooAsync");
for (int i = 0; i < 100; i++)
Console.WriteLine("After that");
Console.ReadKey();
}
private static async Task FooAsync()
{
Console.WriteLine("Before delay");
await Task.Delay(1);
Console.WriteLine("After delay");
}
Run Code Online (Sandbox Code Playgroud)
代码提供了以下行的输出:
Before delay
After FooAsync
After that
After that
After that
After that
After delay
After that
.
.
Run Code Online (Sandbox Code Playgroud)
我知道async/await 不会创建一个单独的线程进行处理,并且当FooAsync到达该await Task.Delay(1)行时它将返回到Main该任务尚未完成的任务,但是,因为我们只在单个线程上运行可以有人解释什么触发FooAsync方法在Main之前的任意点恢复然后Main可以继续?
更新 我收回它,i3arnon和dariogriffo是正确的.代码确实使用了多个线程(正如我之前看到的那样,在调试器中查看或完成了kha建议的显而易见的事情).我对以下页面上的"线程"部分感到困惑,https://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_Threads没有意识到"延续"实际上是指要继续运行的任务计划一旦"等待"的任务完成.
这不是单线程的.
当延迟任务完成时,方法的其余部分将发布到ThreadPool并与主线程同时运行.这里的"触发器"是内部System.Threading.Timer使用的内部回调Task.Delay.
这种行为取决于SynchronizationContext.在UI环境中,这将被发布到相同的UI线程,并且必须等到该线程空闲.
如果您一直在等待FooAsync 从那时返回的任务,那么每次只能运行一个线程.
| 归档时间: |
|
| 查看次数: |
891 次 |
| 最近记录: |