C#Task参数(TaskCreationOptions)

       位于 System.Threading.Tasks.TaskContinuationOptions 

       Thread是基于操作系统级别的线程,而ThreadPool和Task不会创建自己的操作系统线程,二者是由任务调度器(TaskScheduler)执行,默认的调度程序仅仅在ThreadPool上运行。由于任务在ThreadPool上运行,因此创建配置不适合的Task可能会将系统默认的线程池给填满导致其他操作的线程阻塞 。

PreferFairness 

       提示 System.Threading.Tasks.TaskScheduler 以一种尽可能公平的方式安排任务,这意味着较早安排的任务将更可能较早运行,而较晚安排运行的任务将更可能较晚运行。 

 LongRunning 

       指定任务将是长时间运行的、粗粒度的操作,涉及比细化的系统更少、更大的组件。 它会向 System.Threading.Tasks.TaskScheduler提示,过度订阅可能是合理的。 可以通过过度订阅创建比可用硬件线程数更多的线程。 它还将提示任务计划程序:该任务需要附加线程,以使任务不阻塞本地线程池队列中其他线程或工作项的向前推动。设置此项后,告诉任务调度器TaskScheduler启动新的线程,而不是在ThreadPool上运行。

AttachedToParent

       指定将任务附加到任务层次结构中的某个父级。 默认情况下,子任务(即由外部任务创建的内部任务)将独立于其父任务执行。 可以使用AttachedToParent选项以便将父任务和子任务同步。 请注意,如果使用 DenyChildAttach选项配置父任务,则子任务中的AttachedToParent 选项不起作用,并且子任务将作为分离的子任务执行。

static void Main(string[] args)
{
    Task.Factory.StartNew(() =>
    {
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(500);
            Console.WriteLine("t1 end");
        }, TaskCreationOptions.AttachedToParent);

        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            Console.WriteLine("t2 end");
        }, TaskCreationOptions.AttachedToParent);
    }).Wait();

    Console.WriteLine("main end");
    Console.ReadKey();
}

 当t1和t2都完成后main才会完成。

DenyChildAttach 

       指定任何尝试作为附加的子任务执行(即,使用AttachedToParent选项创建)的子任务都无法附加到父任务,会改成作为分离的子任务执行。

static void Main(string[] args)
{
    Task.Factory.StartNew(() =>
    {
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(500);
            Console.WriteLine("t1 end");
        }, TaskCreationOptions.AttachedToParent);

        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(1000);
            Console.WriteLine("t2 end");
        }, TaskCreationOptions.AttachedToParent);
    }, TaskCreationOptions.DenyChildAttach).Wait();

    Console.WriteLine("main end");
    Console.ReadKey();
}

和上例一样,当时将main配置成 DenyChildAttach,会发现main先完成,随后t1和t2才完成。给没有子任务的Task配置该参数无效。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值