非同步程式設計(或多執行緒程式設計)

2022-06-10 02:48:09 字數 4792 閱讀 1423

程序是一種正在執行的程式。

執行緒是程式中的乙個執行流。

多執行緒是指乙個程式中可以同時執行多個不同的執行緒來執行不同的任務。

thread是建立和控制線程的類。

managedthreadid是執行緒id。

currentthread是獲取當前正在執行的執行緒。

同步是呼叫一旦開始,呼叫者必須等到方法呼叫返回後,才能繼續後續的行為。(單執行緒)

非同步呼叫一旦開始,方法呼叫就會立即返回,呼叫者就可以繼續後續的操作。(多執行緒)

主要有thread,threadpool,task

thread就是執行緒,需要自己排程,直接跟系統對接,相對管理比較複雜及效率差。

threadpool是thread的乙個公升級版,threadpool是從執行緒池中獲取執行緒,如果執行緒池中又空閒的元素,則直接呼叫,如果沒有才會建立,而thread則是會一直建立新的執行緒,要知道開啟乙個執行緒就算什麼事都不做也會消耗大約1m的記憶體,是非常浪費效能的。但是threadpool提供的介面比較少。

task和threadpool是一樣的,都是從執行緒池中取空閒的執行緒。比threadpool呼叫介面更加豐富。目前.net使用多執行緒管理,應該優先使用task。

**:

/// /// 多執行緒發展歷史

///

///

///

private void btnhistory_click(object sender, eventargs e)

time:");

var threadstart = new threadstart(donothing);

var thread = new thread(threadstart);

thread.start();

console.writeline($"thread end id: time:");

thread.sleep(3000);

console.writeline($"threadpool start id: time:");

var callback = new waitcallback(donothing);

threadpool.queueuserworkitem(callback);

console.writeline($"threadpool end id: time:");

thread.sleep(3000);

console.writeline($"task start id: time:");

action action = donothing;

task task = new task(action);

task.start();

console.writeline($"task end id: time:");

}

特點:

**:

/// /// 同步(單執行緒)

///

///

///

private void btnsync_click(object sender, eventargs e)

time:");

for (int i = 0; i < 5; i++)

console.writeline($"btnsync_click end id: time:");

}/// /// 非同步(多執行緒)

///

///

///

private void btnasync_click(object sender, eventargs e)

time:");

for (int i = 0; i < 5; i++)

console.writeline($"btnasync_click end id: time:");

}private void donothing()

time:");

thread.sleep(2000);

console.writeline($"donothing end id: time:");

}

1、通過呼叫任務類建構函式例項化,但通過呼叫其start()啟動任務。

task t1 = new task(action, "alpha");

t1.start();

2、通過呼叫taskfactory.startnew(action < object>,object)方法在單個方法呼叫中例項化和啟動任務。

task t2 = task.factory.startnew(action, "beta");
3、通過呼叫run(action)方法在單個方法呼叫中例項化和啟動任務。

task t3 = task.run(action);
result 屬性將阻止呼叫執行緒,直到任務完成。

tasktask1 = task.factory.startnew(() => 1);

int i = task1.result;

可以通過呼叫 wait 方法來等待乙個或多個任務完成,從而同步呼叫執行緒的執行以及它啟動的非同步任務。

呼叫無引數 wait() 方法以無條件等待,直到任務完成。

呼叫wait(int32)和 wait(timespan) 方法會阻止呼叫執行緒,直到任務完成或超時間隔(以先達到者為準)為止。

呼叫waitany(task)方法等待一組任務中第乙個任務完成。

呼叫waitall(task)方法來等待一系列任務全部完成。

呼叫**可以通過使用 try/catch 塊中的以下任意方法來處理異常:

**:

var task1 = task.run(() => );

trycatch (exception e)

console.readkey();

你可以使用 cancellationtokensource 類在以後某一時間發出取消請求。

static void main(string args)

char ch = console.readkey().keychar;

if (ch == 'c' || ch == 'c')

trycatch (operationcanceledexception)

thrown\n");

}finally

console.readkey();

}private static void donothing(int i, cancellationtoken ct)

id: time:");

thread.sleep(i * 1000);

if (ct.iscancellationrequested)

id: ");

ct.throwifcancellationrequested();

}console.writeline($"donothing end index: id: time:");

}

**:

/// /// task實際案例

///

///

///

private void btntask_click(object sender, eventargs e)

time:");

console.writeline($"專案經理設計資料庫,設計原型,分配任務 id: time:");

listtasks = new list();

tasks.add(task.run(() => coding("趙xx","前端頁面")));

tasks.add(task.run(() => coding("王xx", "ios頁面")));

tasks.add(task.run(() => coding("黃xx", "後端介面")));

tasks.add(task.run(() => coding("杜xx", "後端介面")));

taskfactory taskfactory = new taskfactory();

taskfactory.continuewhenall(tasks.toarray(), t =>

time:");

});}private void coding(string personname,string taskname)

開發 id: time:");

thread.sleep(2000);

}

async 和 await幾乎與建立同步方法一樣建立非同步方法。

**:

/// /// async和await應用

///

///

///

private void btnasyncandawait_click(object sender, eventargs e)

time:");

donothingasync();

console.writeline($"btnasyncandawait_click end id: time:");

}private async task donothingasync()

time:");

await task.run(() => time:");

thread.sleep(2000);

console.writeline($"donothingasync task end id: time:");

});console.writeline($"donothingasync end id: time:");

}

C 非同步程式設計與多執行緒程式設計

c 5.0推出了非同步程式設計,通過關鍵字async 和 await及返回型別為task 無返回值的非同步方法 和task 返回值為t的非同步方法 可以將方法封裝為非同步方法。呼叫非同步方法時,遇到await關鍵字程式會立即返回到呼叫者,直到await後的方法執行完成。包括兩種非同步方式 i o繫結...

C 併發程式設計 非同步程式設計與多執行緒

併發 同時做多件事情 多執行緒 併發的一種形式,它採用多個執行緒來執行程式。並行處理 把正在執行的大量的任務分割成小塊,分配給多個同時執行的執行緒。並行處理是多執行緒的一種,而多執行緒是併發的一種。非同步程式設計 併發的一種形式,它採用 future 模式或 callback 機制,以避免產生不必要...

POSIX多執行緒 非同步程式設計舉例

整半年沒有更新,發幾篇以前的讀書筆記。content 0.序 1.基本的同步版本 2.多程序版本 3.多執行緒版本 4.小結 0.序 本節通過乙個簡單的鬧鐘例項演示非同步程式設計方法。該程式迴圈接受使用者輸入資訊,直到出錯或者輸入完畢。使用者輸入的每行資訊有兩部分 鬧鐘等待的時間 秒 和鬧鐘時間到達...