1. 程式人生 > 其它 >C#多執行緒與多工

C#多執行緒與多工

此處介紹了多執行緒和多工簡單使用:

1、多執行緒 Thread,可傳入引數

呼叫:

string id = "123456";
string name = "qt";
var data = new Data { Id = id,Name = name };
Thread t = new Thread(MainThreadWithParam);
t.Start(data);  // 傳入引數

引數封裝:

public struct Data
{
    public string Id;
    public string Name;
}

執行業務方法:

private object mylock = new
object();//非同步鎖,防止多個執行緒呼叫同一個方法,應對該方法不支援併發操作的情況 // 定義執行緒方法: private void MainThreadWithParam(object o) { Monitor.Enter(this.mylock);//啟用非同步鎖 Data d = (Data)o; //型別轉換 Console.WriteLine("Running in a thread, received {0}-{1}", d.Id,d.Name); string id = d.Id; string name = d.Name; //使用者邏輯程式碼 --todo
Monitor.Exit(this.mylock);//關閉非同步鎖 }

2、多工 Task

ThreadPool相比Thread來說具備了很多優勢,但是ThreadPool卻又存在一些使用上的不方便。比如:
  ◆ ThreadPool不支援執行緒的取消、完成、失敗通知等互動性操作;
  ◆ ThreadPool不支援執行緒執行的先後次序;
  以往,如果開發者要實現上述功能,需要完成很多額外的工作,現在,FCL中提供了一個功能更強大的概念:Task。Task線上程池的基礎上進行了優化,並提供了更多的API。在FCL4.0中,如果我們要編寫多執行緒程式,Task顯然已經優於傳統的方式。

呼叫:

string id = "123456";
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
token.Register(() =>
{
    Console.WriteLine("task任務取消");
});
var task = Task.Factory.StartNew(() =>
{
    Console.WriteLine("執行task任務");
    //執行多工方法
    MainTaskWithParam(id, tokenSource);
}, token);

業務方法:

private void MainTaskWithParam(string id, CancellationTokenSource tokenSource) 
{
    //業務邏輯程式碼 --todo

    tokenSource.Cancel();//取消任務
}

總結:實踐是檢驗真理的唯一標準。

參考:https://www.cnblogs.com/zhaoshujie/p/11082753.html