我這裡針對現有的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自動設為nullthreadpool.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...