c 多執行緒使用總結

2022-03-25 08:48:19 字數 3049 閱讀 4684

c# 多執行緒使用總結

執行緒:thread類是c#語言對執行緒物件的乙個封裝;

4核8程序:模擬核,乙個cpu每秒10億次計算,可以分成多個片,每個片可被乙個執行緒使用

cpu分片:作業系統把:cpu分片,乙個物理cpu同時只能為乙個任務服務;

同步方法:發起呼叫,執行完後依次執行下乙個任務

非同步方法:任何乙個非同步多執行緒離不開委託,發起呼叫,啟動乙個新的執行緒來完成任務;

actionaction= this.dosomething;

action.begininvoke("btn");

1.同步方法卡介面,主線程忙與計算,無暇他姑;非同步方法不卡,主線程閒置,計算任務交給子任務;

可以改善使用者體驗,web應用發簡訊通知,啟動非同步多執行緒去完成;

卡介面,慢,啟動有序/不卡,快,啟動無序;

資源換效能 :

1.資源不是無限的;

2.資源排程損耗;

3.所有執行緒並不是越多越好;

程式向執行緒池發執行緒請求,執行緒池向作業系統請求資源,安排不同的cup片排程處理

多執行緒由時間先後順序要求的,要特別小心,不能通過延時,預估來估計;

並行:多核之間叫並行

併發:cpu分片的併發;同一時間做多個事

cpu * 4

async

2.判斷多執行緒執行完成的方法;

1.**callback;

2.asyncresult.iscomleted

3.waitone:asyncresult.asyncwaithandle.waitone()

4.endinvoke(asyncresult)

private void testthread( )

");console.writeline($"btnasyncadvanced_click計算成功了。。");

};asyncresult = action.begininvoke("btnasyncadvanced_click", callback, "aa");

//2 通過iscomplate等待,卡介面--主線程在等待,邊等待邊提示

//( thread.sleep(200);位置變了,少了一句99.9999)

int i = 0;

while (!asyncresult.iscompleted)

%....");

}else

thread.sleep(200);

}console.writeline("中華民族復興已完成,沉睡的東方雄獅已覺醒!");

// 3 waitone等待,即時等待 限時等待

asyncresult.asyncwaithandle.waitone();//直接等待任務完成

asyncresult.asyncwaithandle.waitone(-1);//一直等待任務完成

asyncresult.asyncwaithandle.waitone(1000);//最多等待1000ms,超時就不等了

//4 endinvoke 即時等待, 而且可以獲取委託的返回值 乙個非同步操作只能end一次

action.endinvoke(asyncresult);//等待某次非同步呼叫操作結束

console.writeline("全部計算成功了。。");

funcfunc = () =>

;int iresult = func.invoke();//22

iasyncresult asyncresult = func.begininvoke(ar =>

, null);

int iendresult = func.endinvoke(asyncresult);//22

console.writeline($"****************btnasync_click end ***************");

}----------------------task------------------------------------------

1 thread:執行緒等待,**,前台執行緒/後台執行緒

2 threadpool:執行緒池使用,設定執行緒池,manualresetevent

3 擴充套件封裝thread&threadpool**/等待

1 task:waitall waitany delay

2 taskfactory:continuewhenany continuewhenall

3 並行運算parallel.invoke/for/foreach

thread

threadpool

threadpool.setmaxthreads(8,8) 執行緒池是全域性的,單例,同時併發8個;執行緒復用;

task

.netframework3.0 task 基於執行緒池的,提供了豐富的api

thread.task

task.sleep(300)

task

thread.sleep(2000);主線程等待2秒後在執行,卡畫面;

task.delay(2000).continuewith等待2秒後啟動新執行緒執行,不影響主線程;

task.delay(2000).continuewith(t=>);

1.什麼時候使用多執行緒:任務能併發時

2.多執行緒好處:提公升速度/優化體驗

3.waitall,waitany

4.continuewhenany(),continuewhenall()

主線程等待所有動作完成後執行的動作:task.waitall()

主線程等待任何乙個動作完成後執行的動作:task.waitany()

主線程等待所有動作完成後執行的動作:taskfactory.continuewhenall()

主線程任何乙個完成後執行的工作:taskfactory.continuewhenany(),

parall 併發執行多個action 多執行緒,主介面阻塞,主線程參入計算;

parall.for() 能控制併發數量;

parall.foreach()

paralleloption opt=new paralleloptions():控制線程併發數量如3;

C 幾種多執行緒使用總結

amethod,為該執行緒將要執行的任務 thread thread new thread amethod 設定為後台執行緒,不設定的話預設為前台執行緒 thread.isbackground true 啟動執行緒 thread.start 通過委託,呼叫begininvoke方法來開啟一條執行緒,...

多執行緒使用總結

多執行緒使用總結 基礎 1 最好使用c runtime的函式建立執行緒,即呼叫 beginthreadex建立執行緒。createthread 函式並不會執行c執行時資料塊的變數的每執行緒初始化,因此在任何使用c執行時庫的應用中,不能使用cratethread 函式。2 最好不要顯示的呼叫exitt...

c 多執行緒總結

std thread比較好用,但是系統帶的socket不能呼叫recv handle h thread createthread null,0,fun,null,0,null 建立多執行緒 closehandle h thread 使用者介面執行緒經常過載該函式,工作者執行緒一般不使用 initin...