三二十四线程编程学习笔记——任务并行库(一)

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

 

        
本示例是从义务中收获结果值。我们由此不相同的实践结果来突显在线程池中举办与在主线程中进行的不一致之处。

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

       
Task2与task1相似,Task2通过RunSynchronously()方法运行的。这一个职分运行在主线程中,那些任务的输出与TaskOper方法输出结果一律。那就是task的优势,可以行使task对TaskOper方法举行优化,可以幸免使用线程池来实施一些执行时间越发短的操作。

      
前边我们学习了怎么样是线程,线程之间的联名,使用线程池。使用线程池可以削减我们大批量短期操作的交互线程所用的操作系统资源。

       
首先直接运行TaskOper方法,依照程序运行结果,我们可以了然那么些方式是被一并施行的。

接上文 四线程编程学习笔记——基础(一)

       
接着,大家采取task.Run和task.startNew方法来运行四个任务。与行使task构造函数分化之处,在于那八个被创设的职责会即时施行。所以无需显式地调用
这个义务的Start方法。从task1到task4所有任务都是放在线程池中执行的,数十次实施,能够窥见实施各样是不均等的。

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

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));

        }
    }
}
  1. 代码如下:

 图片 1

       
上面的示范,我们利用task构造函数创立了七个义务。咱们传入了一个lambda表明式做为操作任务。然后利用start启动任务。

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

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

 接上文 二十四线程编程学习笔记——基础(三)

 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); 

        }
    }
}

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

        
C#5.0及之后的版本都曾经放手了对TPL的支撑,允许大家利用await与async关键字展开任务履行。

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

       
一个职责(Task)可以经过多种措施和其余职务组合起来使用。例如,可以同时开启四个任务,等待所有职分完成,再起一个职务进展操作。一个职责可以有三个其余职分组成,那几个职务也足以依次拥有自己的子职分。

       在net framework
4.0中微软又提供了一个新的异步操作的功用,叫做职分并行库(TPL)。职务并行库的为主是义务(task)。一个义务代表了一个异步操作,譔操作可以经过多种办法运行,可以应用或不利用独立的线程。

     

       
然后大家运行了task1,使用start方法启动义务并伺机结果。那一个任务会被放在线程池中运作,而且主线程会等待,直到任务达成并赶回结果。

       
Task3运作task1的不二法门,然而本次没有阻塞主线程,只是在任务落成从前循环打印出职务处境。

一、   成立任务

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

 2.周转结果如下图。我把程序运行了五回。请自行查看分化之处。

二、   使用职分执行基本的操作

         
Task5,由于我们标记为了长日子运作,所以是一个独立的线程,不是线程池中的线程来运转的。

图片 2

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