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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    xls与csv文件的区别
    青音,经典爱情语录
    win7用户账户自动登录方法汇总
    How to using Procedure found Lead Blocker
    FTS(3) BSD 库函数手册 遍历文件夹(二)
    FTS(3) BSD 库函数手册 遍历文件夹(一)
    DisplayMetrics类 获取手机显示屏的基本信息 包括尺寸、密度、字体缩放等信息
    About App Distribution 关于应用发布
    FTS(3) 遍历文件夹实例
    OpenCV 2.1.0 with Visual Studio 2008
  • 原文地址:https://www.cnblogs.com/chenze-Index/p/9258746.html
Copyright © 2011-2022 走看看