接上文十二线程编制程序学习笔记——线程同步

接上文 三八线程编制程序学习笔记——基础(一)

接上文 二十四线程编制程序学习笔记——基础

 接上文 八线程编制程序学习笔记——基础(二)

接上文 八线程编制程序学习笔记——基础

 接上文 八线程编制程序学习笔记——基础(三)

接上文 二十四线程编制程序学习笔记——基础

 接上文 四线程编程学习笔记——线程同步(一)

接上文三二十四线程编制程序学习笔记——线程同步

 接上文 二十三十二线程编制程序学习笔记——线程同步(二)

接上文 十二线程编制程序学习笔记——线程同步

  接上文 多线程编制程序学习笔记——线程同步(三)

伟德国际1946, 接上文 四线程编制程序学习笔记——线程同步

接上文
三十二线程编制程序学习笔记——线程池(一)

接上文
二十多线程编制程序学习笔记——线程池

接上文 二十八线程编制程序学习笔记——线程池(二)

接上文 四线程编制程序学习笔记——线程池

 接上文 二十多线程编程学习笔记——线程池(三)

接上文八线程编制程序学习笔记——线程池

     

前边大家上学了怎样是线程,线程之间的一块,使用线程池。使用线程池能够减小我们大量长期操作的并行线程所用的操作系统能源。

      
前边大家上学了什么是线程,线程之间的一起,使用线程池。使用线程池能够缩小大家大批量短期操作的竞相线程所用的操作系统财富。

在net framework
4.0中微软又提供了一个新的异步操作的功力,叫做职务并行库。职务并行库的中央是任务。1个职务代表了叁个异步操作,譔操作能够经过三种主意运营,可以利用或不利用独立的线程。

       在net framework
4.0中微软又提供了2个新的异步操作的成效,叫做义务并行库(TPL)。职分并行库的主导是天职(task)。二个职分代表了贰个异步操作,譔操作可以因此多样方法运转,能够运用或不应用独立的线程。

二个任务能够透过两种方法和其他任务组合起来使用。例如,能够而且开启五个职责,等待全数职分完结,再起三个职责进展操作。二个职务能够有四个其余职责组成,那些任务也足以依次拥有和谐的子职分。

       
三个职务(Task)能够透过八种方法和此外职责组合起来使用。例如,能够而且开启几个任务,等待全体职分完结,再起五个任务进展操作。三个任务能够有多少个别的任务组成,那么些义务也足以依次拥有本身的子任务。

C#5.0及随后的版本都已经松手了对TPL的支撑,允许大家选拔await与async关键字展开任务履行。

        
C#5.0及之后的本子都曾经松手了对TPL的协理,允许大家选用await与async关键字展开任务执行。

以下示例,大家使用.Net Framework
4.5随后版本。

         以下示例,我们使用.Net
Framework 4.5事后版本。

壹 、 创立职责

 

上边包车型大巴言传身教,我们运用task构造函数创设了多少个职分。大家传入了3个lambda表明式做为操作职分。然后使用start运转任务。

壹 、   创立职责

继之,我们应用task.Run和task.startNew方法来运作三个义务。与应用task构造函数分裂之处,在于那八个被创制的职分会应声施行。所以不要显式地调用
那几个职分的Start方法。从task1到task4全部任务都以放在线程池中进行的,多次进行,能够窥见实施各类是不雷同的。

       
上面包车型大巴言传身教,大家使用task构造函数创立了三个职分。大家传入了1个lambda表明式做为操作任务。然后采纳start运维职务。

Task5,由于大家标记为了长日子运作,所以是叁个单身的线程,不是线程池中的线程来运维的。

       
接着,我们应用task.Run和task.startNew方法来运营多个职责。与使用task构造函数分歧之处,在于那四个被成立的任务会及时执行。所以不要显式地调用
这一个任务的Start方法。从task1到task4全数职务都是放在线程池中执行的,多次进行,能够发现执行种种是不雷同的。

  1. 代码如下:

         
Task5,由于大家标记为了长日子运作,所以是1个独立的线程,不是线程池中的线程来运行的。

  1. 代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks; namespace ThreadTPLDemo{    class Program    {        static void Main(string[] args)        {            Console.WriteLine("Task 运行示例 ————{0}",DateTime.Now);           var task1 = new Task => TaskOper("Task1"));            var task2 = new Task => TaskOper("Task2"));            task1.Start();            task2.Start();                       Task.Factory.StartNew => TaskOper("Task 3"));Task.Run => TaskOper("Task 4"));             //长时间运行            Task.Factory.StartNew => TaskOper("Task 5"),TaskCreationOptions.LongRunning);                      Thread.Sleep(1000);            Console.ReadKey();        }        private static void TaskOper(string  name)        {                       Console.WriteLine("Task 运行在 线程 ID:{0} 上,这个线程是不是线程池中的线程:{1},名称: {2}",            Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread, name);         }    }} 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; 

namespace ThreadTPLDemo
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Task 运行示例 ————{0}",DateTime.Now);

           var task1 = new Task(() => TaskOper("Task1"));
            var task2 = new Task(() => TaskOper("Task2"));
            task1.Start();
            task2.Start();           

            Task.Factory.StartNew(() => TaskOper("Task 3"));
Task.Run(() => TaskOper("Task 4")); 

            //长时间运行
            Task.Factory.StartNew(() => TaskOper("Task 5"),TaskCreationOptions.LongRunning);
                      Thread.Sleep(1000);
            Console.ReadKey();
        }
        private static void TaskOper(string  name)
        {           

            Console.WriteLine("Task 运行在 线程 ID:{0} 上,这个线程是不是线程池中的线程:{1},名称: {2}",            Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread, name); 

        }
    }
}

2.运维结果如下图。我把程序运营了一次。请自行查看区别之处。

 

伟德国际1946 1

 2.运营结果如下图。小编把程序运营了四回。请自行查看不一样之处。

② 、 使用职责履行基本的操作

伟德国际1946 2

本示例是从任务中拿走结果值。大家通过区别的实行理并了结果来浮未来线程池中进行与在主线程中推行的不一样之处。

 

  1. 代码如下:

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks; namespace ThreadTPLDemo{ class Program { static void Main(string[] args) { Console.WriteLine(“Task 基本操作 ————”); TaskOper(“—-主线程Task运转”); Task task1 =CreateTask(“Task1″); task1.Start(); string result = task1.Result; Console.WriteLine(” 运维结果——{0}”, result); Task task2 = CreateTask(“Task2″); task2.RunSynchronously(); result = task1.Result; Console.WriteLine(” 运转结果——{0}”, result); Task task3 = CreateTask(“Task3″); task3.Start(); while(!task3.IsCompleted) { Console.WriteLine(” 状态——{0}”, task3.Status); Thread.Sleep(500); } Console.WriteLine(” ——状态—{0}”, task3.Status); result = task3.Result; Console.WriteLine(” 运营结果——{0}”, result); Console.ReadKey(); } private static string TaskOper(string name) { Console.WriteLine(“Task 线程 ID:{0} 上,是否线程池中的线程:{1},名称: {2}”, Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread, name); Thread.Sleep(两千); return string.Format(“线程ID:{0},名称:{1}”, Thread.CurrentThread.ManagedThreadId,name); } static Task CreateTask(string name) { return new Task => TaskOper; } }}

二 、   使用职务履行基本的操作

2.程序运转结果如下图。

        
本示例是从职分中拿走结果值。大家通过不相同的进行结果来展现在线程池中进行与在主线程中推行的差异之处。

伟德国际1946 3

 1. 代码如下:

第壹直接运转TaskOper方法,遵照程序运转结果,大家得以理解那一个方法是被一道施行的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; 

namespace ThreadTPLDemo
{

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Task 基本操作 ————");
            TaskOper("----主线程Task运行");

           Task<string> task1 =CreateTask("Task1");
            task1.Start();
            string result = task1.Result;
            Console.WriteLine(" 运行结果——{0}", result); 

            Task<string> task2 = CreateTask("Task2");
            task2.RunSynchronously();
            result = task1.Result;
            Console.WriteLine(" 运行结果——{0}", result); 

            Task<string> task3 = CreateTask("Task3");
            task3.Start();
          while(!task3.IsCompleted)
            {
                Console.WriteLine(" 状态——{0}", task3.Status);
                Thread.Sleep(500);
            }

            Console.WriteLine(" ——状态—{0}", task3.Status);
            result = task3.Result;
            Console.WriteLine(" 运行结果——{0}", result);           

            Console.ReadKey();
        }
        private static string TaskOper(string  name)
        {         

            Console.WriteLine("Task 线程 ID:{0} 上,是不是线程池中的线程:{1},名称: {2}",
            Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread, name);
            Thread.Sleep(2000);
            return string.Format("线程ID:{0},名称:{1}", Thread.CurrentThread.ManagedThreadId,name);
        }
        static Task<string> CreateTask(string name)
        {
            return new Task<string>(() => TaskOper(name));

        }
    }
}

然后我们运转了task1,使用start方法运维职务并等候结果。这么些职分会被放在线程池中运维,而且主线程会等待,直到职责实现并回到结果。

2.程序运转结果如下图。

Task2与task1相似,Task2通过RunSynchronously()方法运转的。那些任务运营在主线程中,这几个职务的输出与TaskOper方法输出结果一致。那正是task的优势,能够应用task对TaskOper方法举办优化,能够幸免使用线程池来进行一些实施时间相当短的操作。

 伟德国际1946 4

Task3运作task1的主意,可是这一次没有阻塞主线程,只是在职分成功从前循环打字与印刷出任务状态。

       
首先间接运转TaskOper方法,依据程序运营结果,大家得以精通那几个措施是被一起施行的。

       
然后大家运营了task1,使用start方法运营任务并等候结果。这些职责会被放在线程池中运转,而且主线程会等待,直到义务达成并回到结果。

       
Task2与task1相似,Task2通过RunSynchronously()方法运转的。这几个使时局营在主线程中,那么些职务的输出与TaskOper方法输出结果同样。这正是task的优势,能够行使task对TaskOper方法举行优化,可避防止使用线程池来施行一些履行时间相当的短的操作。

       
Task3周转task1的格局,然则这次没有阻塞主线程,只是在任务到位从前循环打字与印刷出职分状态。

相关文章