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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM