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为什么无效了

  • 相关阅读:
    Lua 语言环境安装
    python __init__.py 的作用
    python functiontools模块中的 wraps
    函数装饰器、类装饰器
    redis pipline 和 事务
    Innodb中的行锁与表锁
    mongoengine 分页 切片与 skip + limit 的区别
    python 可变类型传的内存地址, 不可变类型在传递的时候传的是值
    PHP常用人工智能库
    PHP批量给目录下所有的文件转换编码
  • 原文地址:https://www.cnblogs.com/zsx-blog/p/15355531.html
Copyright © 2011-2022 走看看