(補充)Task<TResult> 類別是從 Task 類別衍生而來,兩者主要差異是,前者是帶一個 泛型參數,也表示任務執行完畢要返回的類型值。
這邊為了簡單講解 Task 類別的用法,為了好示範講解,一樣透過新增一個 Windows Form 專案,在對應的控制箱事件,撰寫核心程式碼….不過在看實際範例程式碼教學時,我先介紹如何三種使用 Task 任務的技巧:
(1)直接使用 Task.Run()的靜態方法,該方法一旦被呼叫,就會馬上進行非同步化任務,而呼叫也會返回一個 Task 實體物件。
(2)新增一個 Task 物件時,傳遞一個委派方法至建構函數,當建立一個 Task 實體物件時,不會馬上執行非同步任務,而是要手動呼叫 Start() 方法,才會開始執行非同步任務。
(3)Task 與 Task<Result> 類別都有公開一個 Factory 靜態屬性,該屬性返回一個 TaskFactory 或 TaskFactory<Result>類別,我們必須再透過 TaskFactory 對應的方法來啟用非同步任務作業。
(實作過程)
步驟 1:
透過 Visual Studio 2017 來建立一個 Windows Form 專案。
步驟 2:
在 Form1 表單,我設計版面與拖拉相關控制項至主畫面,有 一個 Label (用於顯示標題,Text =“輸入一個正整數值:” ; 兩個 TextBox (分別用於讓使用者輸入 一個正整數、與顯示非同步任務執行完畢時,要顯示的結果值);還有一個 Button 控制項(Text =“開始計算任務” , Name =”btnExecTask”) ; 最後還有一個 ProgressBar , 目的是要 Task 執行非同步作業時,可以及時更新進度,通知目前作業進度表給使用者。
主畫面截圖如下:
步驟 3 :
在 Button 按鈕的 click 事件撰寫主要的核心程式碼:
private void btnExecTask_Click(object sender, EventArgs e)
{
uint calcNum = 0;
if (!uint.TryParse(this.txtNumValue.Text, out calcNum))
{
MessageBox.Show("請輸入一個正整數數字!!");
return;
}
//進行更新進度表
IProgress<int> progress = new Progress<int>((p) => progressBar1.Value = p);
//宣告一個 Task 類型變數
Task<long> task = new Task<long>(() =>
{
long result = 0L;
for (int i = 1; i <= calcNum; i++)
{
//累加值
result += i;
//進度值
double currProgress = Convert.ToDouble(i) / Convert.ToDouble(calcNum) * 100d;
//向主執行緒 主畫面 進行更新進度條
progress.Report(Convert.ToInt32(currProgress));
}
return result;
});
this.txtResult.Text = "目前正在執行計算過程中......";
//任務 手動啟動
task.Start();
//等待任務執行完畢過程中,將按鈕先停用,以防止重複執行
this.btnExecTask.Enabled = false;
while (!task.Wait(100))
{
//在等待過程,允許程式繼續處理其他佇列訊息
Application.DoEvents();
}
//任務執行完畢,重新啟用按鈕
this.btnExecTask.Enabled = true;
//顯示計算結果
txtResult.Text = "任務執行完畢,計算結果值為:" + task.Result.ToString();
}
PS.主要程式碼解釋,我都寫在程式碼註解,寫得還滿詳細的….
步驟 4:
執行 compile ,進行測試執行吧…
參考文章
C#多工作業與平行處理技術講解
1.透過 Thread 類別撰寫多執行緒多工作業。
2.透過 Delegate 委託支援的方法,撰寫非同步任務。
3-1.透過 Parallel 類別操控多任務平行作業(一)。
3-2. 透過 Parallel 類別操控多任務平行作業(二)。
4.使用 Task 自行控制非同步任務作業。
5.在非同步作業時,如何取消非同步任務。
6.多執行緒多任務存取相同變數,但卻各自隔離保留各自任務的值。
7.非同步存取變數的問題。
8.非同步資源鎖定解決方式。
網智數位-軟體開發(軟件開發)
針對各特殊產業都可以量身定做符合貴公司的需求,別人無法克服的就是我們的挑戰
業務合作、軟體委外開發
業務窗口:allen@netqna.com
聯繫電話:0920-883-870
公司電話:02-55991310
公司地址(業務營運處):台北市中山區錦州街 25 號 5 樓
skype: netqna
line:netqna
微信:netqna
黃先生 Allen
沒有留言:
張貼留言
如您對本文有任何建議或意見,歡迎您留下您寶貴的意見!