C#Task.Factory.StartNew Longrunning

时间:2017-01-06 10:54:58

标签: c# threadpool

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

Task.Factory.StartNew(() => Console.WriteLine("KO"), TaskCreationOptions.LongRunning);

而这不是:

new Thread(() => Console.WriteLine("KO")).Start();

简而言之,根据C#5.0,TaskCreationOptions.LongRunning应该使任务不使用池化线程(后台线程),这意味着它应该使用前台线程,就像常规线程一样,除了常规线程,一个不需要Console.ReadlineWait()但是Task,不管它是否长时间运行并不重要,我总是要阻止主线程在某种程度上。

那么LongRunningOnComplete()GetAwaiter()GetResult()或任何其他应该呈现结果的函数有什么用呢如果我总是要阻塞主线程我真的得到了结果?

1 个答案:

答案 0 :(得分:3)

您依赖于未定义的行为。别这么做。

你不需要等待任务让它运作 - 这只是确保它以某种方式实际完成的唯一方法。我假设你只是使用一个控制台应用程序而只有上面的代码 - 当线程实际到达Console.WriteLine部分时,主线程已经死了,并且所有后台线程都是如此。 new Thread默认创建一个前台线程,这可以防止整个应用程序退出,尽管事实上" main"线程被终止了。

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

如果您只是执行Console.ReadLine而不是等待任务明确完成,您可以看到这一点 - 它仍然在后台运行,与主执行线程无关,但现在您给它足够的时间完成。在大多数应用程序中,您对主线程执行异步操作异步 - 例如,单击按钮的结果可能是不阻止UI的异步HTTP请求,但如果是UI已关闭,请求仍然终止。