C#中await会创建新线程吗?
1、为什么await前后线程ID会改变
代码:
static async Task Main(string[] args)
{
try
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"【{i}】await前:{Thread.CurrentThread.ManagedThreadId};");
await DelayAsync(i);
Console.WriteLine($"【{i}】await后:{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"------------------------------------------------");
}
}
catch (Exception ex)
{
Console.WriteLine($"{ex.Message}");
}
}
public static async Task DelayAsync(int i )
{
Console.WriteLine($"【{i}】DelayAsyncawait前:{Thread.CurrentThread.ManagedThreadId}");
await Task.Delay(500);
Console.WriteLine($"【{i}】DelayAsyncawait后:{Thread.CurrentThread.ManagedThreadId}");
return;
}
结果
分析
第一次for循环中await前后的线程ID发生了改变,然后线程ID就一直保持不变,针对这种情况我有两个疑惑
1、都说await不会创建新线程,为什么第一次循环线程ID会改变?
2、既然第一次循环线程ID发生了改变,为什么后面的循环线程ID不会发生改变?
针对上面两个疑惑按照我找到的说法是根据SynchronizationContext.Current上下文来判断,但是在这个控制台程序中该上下文一直为空,为什么还会出现这种矛盾的情况,除非第一次循环没有捕获到上下文,而后面捕获到了上下文,那么为什么上下文为空的判断均为true
实在是搞不明白,求大神帮忙解惑