zoukankan      html  css  js  c++  java
  • C# TPL学习

    程序Ⅰ:通过Task类创建新线程

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
     
    namespace Test000
    {
        class Program
        {
            /// <summary>
            /// Task类封装
            /// </summary>
            class MyTask
            {
                /// <summary>
                /// 第一个Task类,每秒计数,计数5次
                /// </summary>
                public static void T1()
                {
                    Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);
                    for (int i = 0; i < 5; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);
                    }
                    Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);
                }
     
                /// <summary>
                /// 第二个Task类,每秒计数,计数5次
                /// </summary>
                public static void T2()
                {
                    Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);
                    Thread.Sleep(500);
                    for (int i = 0; i < 5; i++)
                    {
                        Thread.Sleep(1000);
                        Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);
                    }
                    Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);
                }
            }
     
            static void Main(string[] args)
            {
                //建立两个Task
                Task tsk1 = new Task(MyTask.T1);
                Console.WriteLine("Task #{0}: Constructed!", tsk1.Id);
                Task tsk2 = new Task(MyTask.T2);
                Console.WriteLine("Task #{0}: Constructed!", tsk1.Id);
     
                //运行Task
                tsk1.Start();
                tsk2.Start();
     
                //等待Task运行结束
                WaitAll(tsk1, tsk2);
     
                Console.ReadLine();
            }
     
            /// <summary>
            /// 等待所有的Task运行结束
            /// </summary>
            /// <param name="tsks">等待的Task类</param>
            public static void WaitAll(params Task[] tsks)
            {
                foreach (var in tsks)
                {
                    t.Wait();
                }
            }
        }
    }

    运行结果

    程序Ⅱ:通过TaskFactory启动任务并接收任务的返回值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Test001
    {
        class Program
        {
            /// <summary>
            /// Task类封装
            /// </summary>
            class MyTask
            {
                /// <summary>
                /// 求1+2+...+n的和
                /// </summary>
                /// <param name="n">数n</param>
                /// <returns></returns>
                public static int Sum(object n)
                {
                    int x = (int)n;
                    int sum = 0;
                    for (int i = 1; i <= x; i++)
                    {
                        sum += i;
                    }
                    return sum;
                }
            }
     
            static void Main(string[] args)
            {
                Task<int> tsk = Task<int>.Factory.StartNew(MyTask.Sum, 100);
                Console.WriteLine("Result is: " + tsk.Result);
     
                Console.ReadLine();
            }
        }
    }

    运行结果

    程序Ⅲ:通过Parallel类的Invoke函数,并行调用多个Task

    本程序中通过Lambda表达式来建立新的Task

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
     
    namespace Test002
    {
        class Program
        {
            static void Main(string[] args)
            {
                Parallel.Invoke
                    (
                        () =>
                        {
                            Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);
                            for (int i = 0; i < 5; i++)
                            {
                                Thread.Sleep(1000);
                                Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);
                            }
                            Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);
                        },
                        () =>
                        {
                            Console.WriteLine("Task #{0}: Begin!", Task.CurrentId);
                            Thread.Sleep(500);
                            for (int i = 0; i < 5; i++)
                            {
                                Thread.Sleep(1000);
                                Console.WriteLine("Task #{0}: {1}", Task.CurrentId, i);
                            }
                            Console.WriteLine("Task #{0}: Terminated!", Task.CurrentId);
                        }
                    );
     
                Console.ReadLine();
            }
        }
    }

    运行结果

    程序Ⅳ:通过Parallel类的For和FoeEach函数,并行调用多个Task

    本程序中,通过Stopwatch类统计程序段的运行时间

    从例中可以看出:不是所有的循环在并行化时都是有效的。通常,对于小型循环或执行非常简单的操作的循环来说,使用顺序循环比并行循环更加快速

     
     
     
     
     
     
     
     
     
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Test003
    {
        class Program
        {
            /// <summary>
            /// 示例函数
            /// </summary>
            /// <param name="n">参数</param>
            public static void DoSomeThing(int n)
            {
                int sum = 0;
                for (int i = 0; i < n * 100; i++)
                {
                    sum += i;
                }
            }
     
            static void Main(string[] args)
            {
                //计时工具,需要System.Diagnostics
                Stopwatch sw = new Stopwatch();
     
                //统计依次顺序调用函数的时间
                sw.Start();
                for (int i = 100; i < 105; i++)
                {
                    DoSomeThing(100);
                }
                sw.Stop();
                Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);
                sw.Reset();
     
                Console.WriteLine("===========");
     
                //统计并行调用函数的时间
                sw.Start();
                Parallel.For(100, 105, DoSomeThing);
                sw.Stop();
                Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);
                sw.Reset();
     
                Console.WriteLine("===========");
     
                //统计并行调用函数的时间
                sw.Start();
                Parallel.ForEach(new int[5] { 100, 101, 102, 103, 104 }, DoSomeThing);
                sw.Stop();
                Console.WriteLine("TotalTime: {0}", sw.Elapsed.TotalMilliseconds);
     
                sw.Reset();
                Console.ReadLine();
            }
        }
    }

    运行结果

    END

  • 相关阅读:
    函数与方法(方法前 +
    1362 : 修补木桶 -- 最长的最短边
    149. Max Points on a Line *HARD* 求点集中在一条直线上的最多点数
    148. Sort List -- 时间复杂度O(n log n)
    133. Clone Graph 138. Copy List with Random Pointer 拷贝图和链表
    debug && release
    静态库 && 动态库
    枚举
    获取当前用户所使用的是什么浏览器
    java实现在图片上编辑文本内容
  • 原文地址:https://www.cnblogs.com/tiancai/p/4658744.html
Copyright © 2011-2022 走看看