关于Task执行机制的疑问:启动后无输出,后续代码却触发执行?
Task执行机制疑问解答
测试代码
void Something() => System.Console.WriteLine("Something is done"); Task t = new Task(delegate {Something();}); t.Start(); // nothing activates unless the below code is uncommented // System.Console.WriteLine(33); //displays "33 \nSomething is done" as long as not commented out
疑问点
我对Task的基础执行机制存在疑惑。上述代码中,若注释掉第4行,控制台无任何输出;但取消注释System.Console.WriteLine(33)后,控制台会显示数字33和"Something is done"。
- 为何调用
t.Start()后,控制台未输出"Something is done"? - 为何在
t.Start()之后添加任意代码,就能触发Task执行并输出内容?
补充说明:这是我用于理解Task行为的完整测试程序,代码规模很小。
问题解答
调用
t.Start()后无输出的原因
Task默认依托后台线程运行,而控制台程序的主线程是前台线程。当主线程执行完t.Start()后就没有后续代码了,会直接结束,整个进程随之终止。此时Task的后台线程还没被系统调度执行,或者刚启动还没来得及完成Something()的输出,就被强制终止了,所以控制台没内容。添加任意代码后Task能执行的原因
添加System.Console.WriteLine(33)这类代码时,主线程需要花少量时间执行这段逻辑,相当于给主线程加了个“延迟”。这段时间里,系统会调度Task的后台线程执行,让Something()的输出有机会完成。等主线程跑完新增的代码再结束进程时,Task已经完成了它的工作。
如果想稳定确保Task执行完成后再结束主线程,不用靠这种“延迟”的方式,可以直接调用t.Wait()让主线程等待Task执行完毕,或者在异步方法里用await t。修改后的代码如下:
void Something() => System.Console.WriteLine("Something is done"); Task t = new Task(delegate {Something();}); t.Start(); t.Wait(); // 阻塞主线程,直到Task执行完成
内容的提问来源于stack exchange,提问作者richalot
相关产品推荐
相关产品推荐

