4 0第二十章 執行緒,任務和同步

2021-07-09 14:45:12 字數 2729 閱讀 3933

.net 4.0新的命名空間system.threading.tasks

1)啟動新任務的方式,

第一種是例項化的taskfactory類,把方法傳遞給startnew方法,就會立即啟動執行緒

taskfactory tf=new taskfactory();

task t1=tf.startnew(taskmethod);

task t1=task.factory.startnew(taskmethod);

第二種是使用task的建構函式,再呼叫start()方法。

task t2=new task(taskmethod);

t2.start();

2)連續的任務

通過task可以指定在完成任務後,應開始執行另乙個特定任務。

連續任務通過在任務上呼叫continutewith來定義。

在continuewith的子任務必須要帶乙個task型別的引數

static void main(string args)

static void firstjob()

static void secondjob(task t)

輸出結果:

parallel類

paralle1類使用多個任務,會自動用多個執行緒來完成這個作業。

3)用parallel.for()方法迴圈

parallel.for類似於for迴圈。迭代的順序是不能保證的

//在foro方法中,前兩個引數定義了迴圈的開頭和結束。示例從0迭代到9。第3個引數是乙個

//action委託。整數引數是迴圈的迭代次數,該引數被傳遞給action委託引用的方法。

parallelloopresult result = parallel.for(0, 10, i => ",i);

});console.writeline(result.iscompleted);

//也可以提前中斷pamlle1.foro方法。foro方法的乙個過載版本接受第3個action

//paralleloopstate型別的引數。使用這些引數定義乙個方法,就可以呼叫paralleloopstate的break

//或stop0方法,以影響迴圈的結果。

parallelloopresult result2 = parallel.for(0, 10, (int i, parallelloopstate pls) => ", i);

if (i > 15)

});在呼叫 stop 或 break 後,迴圈中的其他執行緒可能會繼續執行一段時間(這不受應用程式開發人員的控制)

4)用parallel.for(tlocal)方法迴圈

分為三個部分,第一部分(init)引數型別是func,這個例子中是func,即返回string型別的方法。這個方法用於執行迭代的每個執行緒呼叫一次

第二部分(body)例子中引數型別是func第乙個引數是迴圈迭代,第二個引數允許停止迴圈,第三個引數,接受從init部分返回的值,該迴圈體還需要乙個返回值。

第三部分(finally)本例中接受乙個字串。該方法僅對於每個執行緒呼叫一次,這是乙個執行緒推出方法。

parallel.for(0, 20, () =>

,task ", thread.currentthread.managedthreadid, task.currentid);

return "aaa";//這個值會傳遞給第二部分的str1

},(i, pls, str1) =>

str1 thread task loopstate ", i, str1, thread.currentthread.managedthreadid, task.currentid, pls.isstopped);

return string.format("i ", i);

},(str) =>//接受第二部分穿過來的值

", str);});

parallel類

paralle會自動決定啟用多少執行緒來完成指定作業。

example 1

//在parallel.for方法中,前兩個引數定義了迴圈的開頭和結束。示例從0迭代到9。第3個引數是乙個action委託。

parallel.for(0,10,i=>",i);

});console.writeline("done");

例子 1.4 semaphore ,用parallel.for方式改寫

parallel.for(0, tcklist.count, i => 's volspot and volvalue;thread ...", tcklist[i].tostring(), thread.currentthread.managedthreadid);

thread.sleep(1000);

});console.writeline("done");

countdownevent

system.threading.countdownevent 是乙個同步基元,它在收到一定次數的訊號之後,將會解除對其等待執行緒的鎖定。 

使用singal減少乙個訊號

class program

cd.wait();

console.writeline("done");          

console.readline();

}       

}class dojob

public  void domyjob()

}

第二十章 Skeletal Animation

skeletal animation 骨骼動畫 是指互相連線的變換 骨頭 組成的分層集合,以及對應的模型mesh 即骨骼的 當這些變換隨著時間變化而變化時,模型的mesh就會形成動畫效果。本章,我們將會 skeketal animation,並開發一些系統用於支援模型動畫。把乙個skeleton對映...

第二十章 限制

城城內西部某個庭院井底,滕青山正在這。趙丹塵,你想抓我,再回去練上五十年吧。喊了一嗓子後,滕青山又立即鑽進泥土中,繼續前進。泥土中,滕青山現在也不急,不過,此刻滕青山體表的 子彈型光罩 已經沒有螺旋了。通過先天真元,改變身體形狀!看來不是我想象的那樣。滕青山很清楚,先天真元光罩如果單單維持,消耗先天...

第二十章 異常和狀態管理

try中包含的 通長包含需要清理資源的 或者從異常中恢復,或者會丟擲異常的 catch包含異常恢復的 finally包含資源清理的 保證會執行的 如果內部的乙個catch沒有捕獲到異常,那麼會向外層就是呼叫方法的那一層查詢捕獲的 總是先執行內部所有的finally語句,由內而外,最後執行catch的...