请考虑以下代码
public static async Task<int> Answer()
{
await Task.Delay(1000);
return 42;
}
static void Main(string[] args)
{
for (int j = 0; j < 20; j++)
{
Console.WriteLine(j +" " + Thread.CurrentThread.IsThreadPoolThread);
if (j == 1)
{
new Task( async ()=>
{
int answer = await Answer();
Console.WriteLine(answer + " " + Thread.CurrentThread.IsThreadPoolThread);
}).Start();
}
Thread.Sleep(200);
}
return;
你能猜出是什么吗CurrentThread.IsThreadPoolThread
什么时候打印答案是?
看起来Task.Delay(..)
正在这样做,因为如果我删除等待,那么答案是False
。但是,我似乎找不到Delay
实际上在文档中把东西放在了线程池上。
这让我想到了一个更普遍的问题。任务中的内容does实际上启动了一个线程池线程Run(..)
?
Edit:
更换new Task(...)
with Ask()
public static async void Ask()
{
int answer = await Answer();
Console.WriteLine(answer + " " + Thread.CurrentThread.IsThreadPoolThread);
}
产生相同的结果
正如我在我的描述中所描述的async / await intro默认情况下发布await
将捕获当前的“上下文”并使用它来执行延续(在await
)。这个“上下文”是SynchronizationContext.Current
除非是null
,在这种情况下是TaskScheduler.Current
.
我也描述一下using async在控制台应用程序上在我的博客上。控制台应用程序不提供SynchronizationContext
,所以“上下文”又回到了TaskScheduler.Current
。由于当前执行的Task
运行在线程池上,TaskScheduler.Current
是相同的TaskScheduler.Default
,这是线程池任务调度器。
这就是您的代码在线程池线程上恢复的原因。这是正确的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)