协作执行长时间运行的任务

using System.Threading.Tasks;
...
Task task = Task.Factory.StartNew(
           () =>
            WritePi(cancellationTokenSource.Token),
            TaskCreationOptions.LongRunning);
task.Wait();

线程池假定所有工作都是处理器受限的,而运行时间都较短。这些假设的目的是控制创建的线程数量,防止因为过多分配昂贵的线程资源以及超额预定处理器而造成过于频繁的上下文切换和时间分片。

  但是,如果开发人员知道一个任务要长时间运行,会长时间“霸占”一个底层线程资源,就可以通知调度器任务不会太快结束工作。这个通知有两方面的作用。首先,它提醒调度器或许应该为该任务创建专用线程(而不是使用来自线程池的)。其次,它提醒调度器可能应该调度比平时更多的线程。这会造成更多的时间分片。但这是一件好事。我们希望长时间运行的任务霸占整个处理器,让其他短时间的任务没法运行。短时间运行的任务利用分配到的时间片,能在短时间内完成大部分工作,而长时间运行的任务基本注意不到因为和其他任务共享处理器而产生的些许延迟。为此要在调用StarNew()时使用TaskCreationOptions.LongRunning选项。

...

TaskCreationOptions.LongRunning是Task.Factory.StratNew()支持的,Task.Run()不支持此选项。

<<c#6.0本质论>>

posted on 2017-09-19 10:56  吃肉不吃菜  阅读(277)  评论(0编辑  收藏  举报

导航