zoukankan      html  css  js  c++  java
  • 线程

    今天师傅教了一个线程入门知识点,以备后面使用:

     1  class Program
     2     {
     3         static void Main(string[] args)
     4         {
     5                 Stopwatch watch = Stopwatch.StartNew();
     6 
     7                 ////业务1  拿到起返回值
     8                 //var t1 = T1();
     9                 //Console.WriteLine("hhh");
    10                 ////业务2   拿到返回值
    11                 //var t2 = T2();
    12                 //Console.WriteLine("hhh2");
    13                 //string t = t1 + t2;
    14                 
    15                 var task1 = Task.Run(() =>
    16                     {
    17                         return T1();
    18                     });
    19                 Console.WriteLine("hhh");
    20 
    21                 var task2 = Task.Run(() =>
    22                 {
    23                     return T2();
    24                 });
    25                 Console.WriteLine("hhh2");
    26 
    27                 Task.WhenAll(task1, task2);
    28 
    29                 string t = task1.Result + task2.Result;
    30             
    31 
    32             //要把业务1的返回值和业务2的返回值拼接起来,输出
    33 
    34 
    35             watch.Stop();
    36             var time = watch.ElapsedMilliseconds;
    37 
    38             Console.WriteLine(t);
    39             Console.WriteLine("耗时:{0}", watch.ElapsedMilliseconds);
    40 
    41             Console.ReadKey();
    42 
    43         }
    44 
    45         public static string T1()
    46         {
    47             Thread.Sleep(3000);
    48 
    49             return "Msg1";
    50         }
    51 
    52         public static string T2()
    53         {
    54             Thread.Sleep(5000);
    55 
    56             return "Msg2";
    57         }
    58     }
    59        
    Task.Run()

    输入结果:

    task1和task2都为子线程。而直接输出hhh和hhh2,分别占用的是task1和task2子线程的时间。主线程走到task1和task2只是执行了开启(秒开)。

    执行到 Task.WhenAll(task1, task2);的时候,才输出共消耗的时间(等待所有任务结束使用)

    格式化显示时间:

    1            {   //格式化显示时间
    2                 TimeSpan ts = watch.Elapsed;
    3                 // Format and display the TimeSpan value.
    4                 string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
    5                     ts.Hours, ts.Minutes, ts.Seconds,
    6                     ts.Milliseconds / 10);
    7                 Console.WriteLine("RunTime " + elapsedTime);
    8             }        

     

    task1 和  task2 两个任务在定义之后就已经马不停蹄的在子线程中运行了,Task.WaitAll 是一个等待的过程,参数就是Task参数,一旦全部执行完毕了,就继续往下执行,这里是阻塞的,还是比较好理解的。

    这样的话WaitAny就很好理解了,就是参数里面的Task 有任意一个执行完成,就继续执行后面的逻辑

    WhenAll

    WhenAll其实跟WaitAll是为了实现一样的功能,只是在WaitAll基础上又做了一层包装,

                    Task.WhenAll(task1, task2).ContinueWith(p =>
                    {
                       
                    }, TaskContinuationOptions.OnlyOnRanToCompletion);

    1.WaitAny(执行的线程等待其中任何一个线程执行完毕即可执行)

    2.WaitAll(执行的线程等待其中所有线程执行完毕方可执行)

     1  var t1=Task.Run(() =>
     2             {
     3                 Console.WriteLine("demo1,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
     4             });
     5             var t2 = Task.Run(() =>
     6             {
     7                 Console.WriteLine("demo2,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
     8             });
     9             var t3 = Task.Run(() =>
    10             {
    11                 Console.WriteLine("demo3,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
    12             });
    13             var t4 = Task.Run(() =>
    14             {
    15                 Console.WriteLine("demo4,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
    16             });
    17             var t5 = Task.Run(() =>
    18             {
    19                 Console.WriteLine("demo5,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
    20             });
    21             var t6= Task.Run(() =>
    22             {
    23                 Console.WriteLine("demo6,当前线程id为:" + Thread.CurrentThread.ManagedThreadId + ",当前时间为" + watch.ElapsedMilliseconds);
    24             });
    25             Task.WaitAll(t1,t2,t3,t4,t5,t6);
    26             Console.WriteLine("执行完毕,WaitAll,线程id为:" + Thread.CurrentThread.ManagedThreadId + "耗时为:" + watch.ElapsedMilliseconds);
    27             Console.ReadKey();
    View Code

    作者:chenze
    出处:https://www.cnblogs.com/chenze-Index/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    机器学习概要
    Latex公式压缩
    MATLAB多项式运算
    利用MathType为公式编号并引用
    MATLAB符号对象与符号运算
    MATLAB矩阵运算
    MATLAB绘制函数图
    MATLAB程序控制语句
    MATLAB关系运算符和逻辑运算符
    Raspberry pi之wifi设置-3
  • 原文地址:https://www.cnblogs.com/chenze-Index/p/9258746.html
Copyright © 2011-2022 走看看