zoukankan      html  css  js  c++  java
  • Task.run为什么子线程里的设置“TaskCreationOptions.AttachedToParent”无效

                //TaskCreationOptions.AttachedToParent不起作用
                Task task = Task.Run(() =>
                {
                    var task1 = new Task(() =>
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine("11111");
                    }, TaskCreationOptions.AttachedToParent);
                    task1.Start();
    
                });
    
                task.ContinueWith(t =>
                {
                    Console.WriteLine("222222");
                });
                task.Wait();
                Console.WriteLine("主线程执行完毕");    

    执行结果:

     TaskCreationOptions.AttachedToParent,这里的设置不起作用

    //TaskCreationOptions.AttachedToParent起作用
                Task task = new Task(() =>
                {
                    var task1 = new Task(() =>
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine("11111");
                    }, TaskCreationOptions.AttachedToParent);
                    task1.Start();
    
                });
    
                task.ContinueWith(t =>
                {
                    Console.WriteLine("222222");
                });
    
                task.Start();
                task.Wait();
                Console.WriteLine("主线程执行完毕");

      TaskCreationOptions.AttachedToParent,起到了想要的结果。

    通过reflector发现Task.run的底层代码

     public static Task Run(Func<Task> function, CancellationToken cancellationToken)
        {
          if (function == null)
            throw new ArgumentNullException(nameof (function));
          if (AppContextSwitches.ThrowExceptionIfDisposedCancellationTokenSource)
            cancellationToken.ThrowIfSourceDisposed();
          return cancellationToken.IsCancellationRequested ? Task.FromCancellation(cancellationToken) : (Task) new UnwrapPromise<VoidTaskResult>((Task) Task<Task>.Factory.StartNew(function, cancellationToken, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default), true);
        }

    其中有TaskCreationOptions.DenyChildAttach,解释了为什么Task.run的  TaskCreationOptions.AttachedToParent为什么无效了

  • 相关阅读:
    Gym
    博客搬家
    UVA
    UVA
    UVA
    UVA
    UVA
    UVA1589——xiangqi
    SDUSToj第十一次作业源代码格式问题
    【成长之路】【python】python基础3
  • 原文地址:https://www.cnblogs.com/zsx-blog/p/15355531.html
Copyright © 2011-2022 走看看