C#Task.Factory.start新长时间运行

C#Task.Factory.start新长时间运行,c#,threadpool,C#,Threadpool,我想了解为什么需要阻止以下内容才能让控制台写入: Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.LongRunning); 这并不是: new Thread(() => Console.WriteLine("KO")).Start(); 简而言之,根据C#5.0,TaskCreationOptions.LongRunning应该使任务不使用池线程(即后台线程),这意味着它应该像普通

我想了解为什么需要阻止以下内容才能让控制台写入:

Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.LongRunning);
这并不是:

new Thread(() => Console.WriteLine("KO")).Start();
简而言之,根据C#5.0,
TaskCreationOptions.LongRunning
应该使任务不使用池线程(即后台线程),这意味着它应该像普通线程一样使用前台线程,除了普通线程之外,不需要
控制台。Readline
等待()
但是对于
任务
,不管它是否长时间运行,我总是必须以某种方式阻止主线程


那么,如果我总是要自己阻塞主线程才能得到结果,那么长时间运行的
OnComplete()
GetAwaiter()
GetResult()
或任何其他应该呈现结果的函数有什么好处呢?

您依赖的是未定义的行为。不要那样做

你不需要等待任务完成——这只是确保它以某种方式实际完成的唯一方法。我假设你只是在使用一个控制台应用程序,除了上面的代码之外什么都没有——当线程实际到达
控制台.WriteLine部分时,主线程已经死了,所有后台线程都死了
new Thread
默认情况下创建一个前台线程,这将阻止整个应用程序退出,尽管“主”线程已终止

任务(以及任何类型的异步操作)背后的思想是,它们允许您发出并发请求,并构建异步操作链(使它们同步运行,这是您通常想要的)。但是您仍然需要同步点来实际创建一个可行的应用程序-如果您的应用程序在任务完成之前退出,那就太糟糕了:)


如果您只需执行一个
控制台.ReadLine
,而不是等待任务显式完成,则可以看到这一点-它仍然在后台运行,独立于主执行线程,但现在您给了它足够的时间来完成。在大多数应用程序中,您可以对主线程异步执行异步操作—例如,单击按钮的结果可能是一个不阻止UI的异步HTTP请求,但如果UI关闭,请求仍然会终止。

这意味着它应该使用前景线程Hi Luaan,感谢您的清除。我只是认为“LongRunning”应该将任务从后台线程转移到前台线程,正如您所说的那样,防止应用程序像普通线程一样退出。但是我理解你关于任务之前退出应用程序的说法,我永远不知道结果,所以最好是明确阻止威胁,直到我得到任何结果。我还认为OnCompleted()应该为我做这件事,所以当它没有做的时候,我认为有什么不对。@AndrewH这只是给任务调度器的一个提示,它不是一个纯CPU任务,这通常意味着它没有从线程池中分配线程。但是新线程仍然是一个后台线程,它与线程池线程完全正交。任何线程都可以是前台线程或后台线程-前台线程阻止应用程序退出,后台线程不阻止。但理想情况下,您希望清楚线程正在做什么,并且只在一切完成后才退出应用程序。你喜欢那些不再有UI但不会消亡的应用吗?这是一个共同的原因:)谢谢Luaan的帮助!非常感谢。