C#多線程Task類的使用(一)

關於多線程前面到工.NET1.0版本出來的Thread,.NET2.0版本出來的ThreadPool,那麼今天我們介紹.NET3.0出來的新的多線程操作的類Task。相對於前面的兩個版本出來的多線程操作類,Task類更加的強大,提供了豐富的Api。下面我們介紹Task的使用

一、新建
新建窗口項目,將項目屬性中的輸出類型設置爲控制檯輸出。如下所示:
在這裏插入圖片描述

定義兩個方法以作試驗用

#region   //兩個共用方法用作調用
public void doSomething1(string name)  //定義一個方法名爲doSomething1()
{
    Console.WriteLine("doSometing1方法調用開始");

    Thread.Sleep(2000);                //將當前的線程暫停2000ms即2秒

    //輸出調用方名稱+當前線程名+本方法標識
    Console.WriteLine("用:" + name + "在" + Thread.CurrentThread.ManagedThreadId.ToString("00") + "線程中執行方法1\n");
}

public void doSomething2(string name)  //定義一個方法名爲doSomething2()
{
    Console.WriteLine("doSometing2方法調用開始");

    Thread.Sleep(2000);               //將當前的線程暫停2000ms即2秒

    //輸出調用方名稱+當前線程名+本方法標識
    Console.WriteLine("用:" + name + "在" + Thread.CurrentThread.ManagedThreadId.ToString("00") + "線程中執行方法2\n");
}
#endregion

二、多線程Task的基本使用

#region   //多線程Task的基本使用,總共有以下幾種方法
private void button1_Click(object sender, EventArgs e)
{
    Console.WriteLine("Task使用演示開始");
    Task task1 = new Task(() => 
    {
        Console.WriteLine("task1的線程ID爲{0}", Thread.CurrentThread.ManagedThreadId.ToString());              
    });
    task1.Start();  //線程開始

    Task task2 = Task.Run(()=>
    {
        Console.WriteLine("task2的線程ID爲{0}", Thread.CurrentThread.ManagedThreadId.ToString());
    });

    TaskFactory taskFactory1=Task.Factory;
    Task task3=taskFactory1.StartNew(()=>
    {
        this.doSomething1("taskFactory1已執行");
    });

    TaskFactory taskFactory2 = new TaskFactory();
    Task task4 = taskFactory2.StartNew(() =>
    {
        this.doSomething2("taskFactory2已執行");
    });           
}
#endregion

程序執行結果如下圖:
在這裏插入圖片描述

三、Task與ThreadPool的關係

Task與ThreadPool有沒有關係呢?答案是肯定的,其實Task是從ThreadPool來的,他們受制於ThreadPool。以下爲相關說明以助佐證。

#region  //Task的線程來自於線程池
private void button2_Click(object sender, EventArgs e)
    {
        //ThreadPool.SetMaxThreads(8,8);  //設置線程池中的線程最大數目。
        for (int i = 0; i < 100; i++)
		{
            int k = i;
			Task myTask = Task.Run(() =>
            {
                Console.WriteLine("這是第{0}次執行,線程ID爲:{1}",k,Thread.CurrentThread.ManagedThreadId.ToString());
                Thread.Sleep(3000);
            });
		}
        /*
         * 如果不設置線程池的最大線程大小的話,上述代碼運行中用到的線程數不止8個
         * 如果設置了線程池的最大線程大小的話,上述代碼運行中用到的線程數一定不超過8個
         * 從而可以作證,Task就是從ThreadPool裏來的,受線程池管控        
         */
        Console.WriteLine("測試完成");
    }
#endregion

上述代碼運行之後可以看出每次迭代所分配的線程ID,如果沒有設置ThreadPool線程池的最大線程數的話,運行過程總分配的不同的線程數目可能不止8個。但是設置了ThreadPool線程池中線程數目的話,最終執行後線程分配的ID中不會超過8種,這就能夠證明Task與ThreadPool之間的關係了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章