多執行緒程式設計學習筆記 任務並行庫(一)

2022-02-09 07:18:01 字數 3546 閱讀 2367

接上文 多執行緒程式設計學習筆記

——基礎(一)

接上文 多執行緒程式設計學習筆記

——基礎(二)

接上文 多執行緒程式設計學習筆記

——基礎(三)

接上文 多執行緒程式設計學習筆記——執行緒同步(一)

接上文 多執行緒程式設計學習筆記——執行緒同步(二)

接上文 多執行緒程式設計學習筆記——執行緒同步(三)

接上文多執行緒程式設計學習筆記——執行緒池(一)

接上文 多執行緒程式設計學習筆記——執行緒池(二)

接上文多執行緒程式設計學習筆記——執行緒池(三)

前面我們學習了什麼是執行緒,執行緒之間的同步,使用執行緒池。使用執行緒池可以減少我們大量短時間操作的並行執行緒所用的作業系統資源。

在net framework 4.0中微軟又提供了乙個新的非同步操作的功能,叫做任務並行庫(tpl)。任務並行庫的核心是任務(task)。乙個任務代表了乙個非同步操作,譔操作可以通過多種方式執行,可以使用或不使用獨立的執行緒。

乙個任務(task)可以通過多種方式和其他任務組合起來使用。例如,可以同時開啟多個任務,等待所有任務完成,再起乙個任務進行操作。乙個任務可以有多個其他任務組成,這些任務也可以依次擁有自己的子任務。

c#5.0及之後的版本都已經內建了對tpl的支援,允許我們使用await與async關鍵字進行任務執行。

以下示例,我們使用.net framework 4.5之後版本。

一、   建立任務

下面的示例,我們使用task建構函式建立了兩個任務。我們傳入了乙個lambda表示式做為操作任務。然後使用start啟動任務。

task5,由於我們標記為了長時間執行,所以是乙個單獨的執行緒,不是執行緒池中的執行緒來執行的。

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

using

system.threading.tasks;

namespace

threadtpldemo

",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)

上,這個執行緒是不是執行緒池中的執行緒:,名稱:

", thread.currentthread.managedthreadid,thread.currentthread.isthreadpoolthread, name); }}

}

2.執行結果如下圖。我把程式執行了兩次。請自行檢視不同之處。

二、   使用任務執行基本的操作

1. **如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

using

system.threading.tasks;

namespace

threadtpldemo

", result);

task

task2 = createtask("

task2");

task2.runsynchronously();

result =task1.result;

console.writeline(

"執行結果——

", result);

task

task3 = createtask("

task3");

task3.start();

while(!task3.iscompleted)

", task3.status);

thread.sleep(

500);

}console.writeline(

"——狀態—

", task3.status);

result =task3.result;

console.writeline(

"執行結果——

", result);

console.readkey();

}private

static

string taskoper(string

name)

上,是不是執行緒池中的執行緒:,名稱: ",

thread.currentthread.managedthreadid,thread.currentthread.isthreadpoolthread, name);

thread.sleep(

2000

);

return

string.format("

執行緒id:,名稱:

", thread.currentthread.managedthreadid,name);

}static task createtask(string

name)}}

2.程式執行結果如下圖。

首先直接執行taskoper方法,根據程式執行結果,我們可以知道這個方法是被同步執行的。

task2與task1相似,task2通過runsynchronously()方法執行的。這個任務執行在主線程中,這個任務的輸出與taskoper方法輸出結果一樣。這就是task的優勢,可以使用task對taskoper方法進行優化,可以避免使用執行緒池來執行一些執行時間非常短的操作。

task3執行task1的方法,但是這次沒有阻塞主線程,只是在任務完成之前迴圈列印出任務狀態。

C 多執行緒開發之任務並行庫詳解

目錄 之前學習了執行緒池,知道了它有很多好處。使mvsaevt用執行緒池可以使我們在減少並行度花銷時節省作業系統資源。可認為執行緒池是乙個抽象層,其向程式設計師隱藏了使用執行緒的細節,使我們可以專心處理程式邏輯,而不是各種執行緒問題。但也不是說我們所有的專案中都上線程池,其實它也有很多弊端,比如我們...

多執行緒程式設計學習筆記(一)

多執行緒程式設計筆記 一 操作執行緒 1 操作例項 using system using system.threading 執行threadmethod的執行緒的 為 2 主線程結束 在threadmethod中,啟動子執行緒後,主線程休眠0.5等待子執行緒執行,子執行緒執行threadmethod...

Python 並行程式設計 多執行緒

最近看了一下 python並行程式設計手冊 雖然這本書薄薄的,包含內容挺多,但是有很多地方講的不清楚,而且有一些bug出現,講道理不推薦看這本書,但是我也隨手翻完了,也寫著玩,總結一下python並行程式設計,順便寫一寫書裡有問題的地方。這本書的問題過多,不建議閱讀!尤其是mpi4py之後的內容。棄...