C# 多线程之--任务并行库(1)

最近在学习C#的并行编程,在每本书上的看到的知识点都不全面,所以先参考多本书书籍的讲解,将并行编程,多线程编程的知识点整理一下,既是对该知识的整理,也是方便学习C#的朋友们快速理解这些知识,并不是所的的范例都是原创,所的范例绝对是编译通过再上传的,如发现有任何Bug,请多多指教。 
  


.NET 4.0引入如TPL--Task Parallel Libray 任务并行库,极大的方便了异步并行编程。.NET4.5加以轻微的改进,更加方便使用。

TPL核心是任务,一个任务代表一个异步操作,该操作可以通过多种方式运行,可以使用或不使用独立线程运行。一个任务可以通过多种方式和其它任务组合起来。


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


//.NET4.0  引入任务并行库 Task Parallel Library --TPL
//.NET4.5  轻微改建,使用更简单,
//C#5.0    支持TPL,允许使用await,ansyc关键字来操作任务

//TPL 核心是任务,一个任务代表一个异步操作,该操作可以通过多种方式运行,可组合任务
//可以使用或不使用独立的线程运行

namespace 创建任务测试
{
    class Program
    {
        static void TasKMethod(string name)
        {
            Console.WriteLine("Task {0} is running on a thread:{1},Is ThreadPool Thread:{2}",
                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Main Thread is:{0},Is ThreadPool :{1}",
                Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
            Task t1 = new Task(() => TasKMethod("Task1"));
            var t2 = new Task(() => TasKMethod("Task2"));
            t1.Start();
            t2.Start();

            Task.Run(() => TasKMethod("Task3"));
            Task.Factory.StartNew(() => TasKMethod("Task4"));
            Task.Factory.StartNew(() => TasKMethod("Task5"), TaskCreationOptions.LongRunning);


            Console.ReadLine();

        }
    }
}

运行结果如下:
//Main Thread is:10,Is ThreadPool :False
//Task Task1 is running on a thread:11,Is ThreadPool Thread:True
//Task Task2 is running on a thread:11,Is ThreadPool Thread:True
//Task Task5 is running on a thread:15,Is ThreadPool Thread:False
//Task Task3 is running on a thread:14,Is ThreadPool Thread:True
//Task Task4 is running on a thread:11,Is ThreadPool Thread:True

从运行结果去体会,创建的任务所处的线程ID和是否为线程池线程。

通过Task构造函数创建的任务,必须使用start方法会执行任务。

Run,StartNew方法创建的任务直接执行,并且StartNew方法可以有附件参数。

长时间运行的Task5就不是有线程池中的线程。





你可能感兴趣的:(C# 多线程之--任务并行库(1))