C 多執行緒技術總結(非同步)

2022-01-22 18:48:31 字數 4030 閱讀 8837

我這裡針對現有的c#多執行緒技術進行乙個彙總,一是複習,二是方便索引,文章部份知識點**於網路,非本人原創。

一、並行(非同步):

1.system.threading.tasks命名空間下的(tpl):

1.1:parallel.invoke --並行執行多個任務,主線程等待並行執行完畢後才開始續續執行。

示例:

static void main(string args)

,run1,run2);

console.writeline("我是主線程!");

console.read();

}static void run1()

static void run2()

1.2:parallel.for--迴圈迭代多個任務,多個任務之間存在並**況,主線程等待迴圈迭代的多個任務執行完畢後才開始續續執行。

示例:

parallel.for(0, 10, (i) => 個任務,執行緒id是:",i,thread.currentthread.managedthreadid);

thread.sleep(new random().next(10) * 10 * 500);

console.writeline("執行緒id是:執行完成", thread.currentthread.managedthreadid);

});

1.3:parallel.foreach--迴圈迭代多個任務,多個任務之間存在並**況,主線程等待迴圈迭代的多個任務執行完畢後才開始續續執行。注意它有多個過載方法

示例:

var bag = new concurrentbag();

parallel.foreach(partitioner.create(0, 100), i =>

個任務,執行緒id是:", m, thread.currentthread.managedthreadid);

}});

console.writeline("平行計算:集合有:", bag.count);

1.4:tap(基於任務的非同步編),使用task類 (注意:預設任務開啟後,會在新執行緒中執行,主線程不會等待任務而是繼續下面的執行,若使用task.waitall,則會等待相應的任務完成後才會執行)

示例:

//第一種方式啟動

var task1 = new task(() => //例項化

);task1.start(); //啟動

//第二種方式開啟

var task2 = task.factory.startnew(() => //直接建立任務並啟動

);//主線程等待任務執行完

task.waitall(task1, task2);

2.parallelenumerable類中的擴充套件方法(先將列舉物件使用asparallel轉換成parallelquery型別,然後就可以使用parallelquery在parallelenumerable類相關的擴充套件方法)

示例:

var resultlist = testlist.asparallel().where(i=>i>=100).tolist();

console.writeline("resultlist count:", resultlist.count);

3.建立新thread--新執行緒啟動後,主線程與建立的執行緒各自執行,若需要主線程等待非同步執行緒執行完成後才執行,則應使用asyncthread.join方法。

示例:

static void asyncthreadmethod()

", thread.currentthread.managedthreadid);

}static void asyncthreadmethod(object state)

,狀態:", thread.currentthread.managedthreadid,state);

}//建立執行緒並執行

thread asyncthread = new thread(new threadstart(asyncthreadmethod));

asyncthread.isbackground = true;

asyncthread.start();

thread asyncthread2 = new thread(new parameterizedthreadstart(asyncthreadmethod));

asyncthread2.isbackground = true;

asyncthread2.start("這是來自主線程的引數");

4.使用threadpool.queueuserworkitem靜態方法--waitcallback**方法要求其必需帶乙個object的引數

示例:

threadpool.queueuserworkitem(new waitcallback(asyncthreadmethod));//不帶引數,則系統將state自動設為null

threadpool.queueuserworkitem(new waitcallback(asyncthreadmethod), "這是來自主線程的引數");

5.apm(非同步程式設計模型),利用begininvoke與endinvoke完成非同步執行委託方法

示例:

funcfuncdelegate = (s) =>

;//1.無阻塞非同步**

var aysncresult = funcdelegate.begininvoke("這是來自主線程的引數", new asynccallback((result) =>

),"其它引數");

//2.阻塞主線程,使主線程等待執行完畢

string data2 = null;

var aysncresult2 = funcdelegate.begininvoke("這是來自主線程的引數2", null, null);

data2 = funcdelegate.endinvoke(aysncresult2);//第一種阻塞方法

while (!aysncresult2.iscompleted) //第二種阻塞方法

data2 = funcdelegate.endinvoke(aysncresult2);

waithandle waithandles = new waithandle;

while (waithandle.waitall(waithandles, 5000)) //第三種阻塞方法

6. eap(基於事件的非同步程式設計)--主要用在客戶端應用程式中

示例:

//例子一

var client = new webclient();

client.downloadprogresschanged += delegate(object s, downloadprogresschangedeventargs e)

", e.progresspercentage);

};client.downloadstringcompleted += delegate(object s,downloadstringcompletedeventargs e)",e.result.length);

console.writeline("download completed!");

};client.downloadstringasync(new uri(""));

//例子二

backgroundworker worker = new backgroundworker();

worker.dowork += (s, e) => ;

worker.runworkercompleted += (s, e) => ;

worker.runworkerasync();

7.async和await關鍵字

示例:

public taskgetvalueasync(double num1, double num2)

return num1;

});} public async void displayvalue()

//呼叫

displayvalue();//不會阻塞主線程

c 非同步多執行緒

1.asyncrel delegate.begininvoke實現委託非同步呼叫。2.非同步等待 asyncrel.iscompleted用於判斷是否執行完畢 or endinvoke用於等待執行完。3.非同步多執行緒 資源換時間 使用場景 1.任務比較多,需要提高效率,資源換時間 2.推遲執行,比...

c 非同步 多執行緒

c 到了現在6.0時代對於非同步多執行緒也出了不少的類,從最開始thread到threadpool 到後面的task 到現在async await 也經歷了不少版本。今天乙個乙個來聊聊。首先我們要明確非同步和多執行緒不是乙個概念,非同步指向的是執行的邏輯順序不是同步的。了解了非同步多執行緒的理念後那...

多執行緒技術總結

1,程序和執行緒的概念。程序 執行緒 2,jvm中的多執行緒體現。主線程,垃圾 執行緒,自定義執行緒。以及他們執行的 的位置。3,什麼時候使用多執行緒,多執行緒的好處是什麼?建立執行緒的目的?當需要多部分 同時執行的時候,可以使用。4,建立執行緒的兩種方式。繼承thread 步驟 實現runnabl...