狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频

當前位置:系統(tǒng)之家 > 技術開發(fā)教程 > 詳細頁面

初識C#線程

初識C#線程

更新時間:2024-04-08 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

作者: BUIILDER.COM

使用多線程技術能有效地幫助你實現(xiàn)應用程序的更高性能和更優(yōu)良的可伸縮性。但在真正運用這項技術的時候務必小心。本文是對線程技術所牽扯的工具和技術問題系列文章的開篇。我首先對線程概念進行介紹,然后總結(jié)一些常用的構(gòu)造,最后介紹它們的用法。

線程的兩面性

用Java語言編寫多線程程序并不難,這是好事也是壞事。微軟在開發(fā)C#時,他們把這種易用性的窘境全盤照搬到了整個新平臺上。同時,C#相比Java具有更多的程序原語,但是Thread對象和同步監(jiān)視器的基本Java原語從形式和功能上看都已足夠提供強大的線程編程能力了。因此,在決定為應用程序采用多線程技術之前務必小心。

為什么不用多線程
首先得記住,在決定是否采用多線程技術時,除非你正在玩代碼,否則千萬別因為多線程編程夠“酷”而簡單地使用線程技術編程。多線程編程技術太時髦了,如果你不小心點你的老板遲早也會著迷,那時你就死定了。其次,不要因為讓程序運行得更快而輕易采用多線程,除非你真的能證明單線程實現(xiàn)確實慢得可以。最后,在冒昧地一頭扎進多線程機制之前,先回憶下微軟所提供的一種公寓(apartment)模型,也就是把對象寫成單線程構(gòu)造而運行在多線程環(huán)境下。所以,說來說去,你并不一定非要采用多線程編碼。不過,公寓模型是另外一個話題了。

如果做得不對,多線程編程勢必會打開“潘朵拉的盒子”(意思是說惹出無數(shù)的麻煩)。重復性不明顯、產(chǎn)生程序垃圾、記數(shù)器沒有正確增值等等。你的應用程序還可能突然掛起。例如,數(shù)據(jù)庫連接這類資源就可能出人意料地關閉或者變得過載。高級開發(fā)人員所面臨的一個大麻煩就是解決線程問題。這些大問題不花點時間休想解決,而且它們對產(chǎn)品交貨日期以及產(chǎn)品可靠性產(chǎn)生了嚴重的負面影響。

為什么要用多線程
如果你的應用程序需要采取以下的操作,那么你盡可在編程的時候考慮多線程機制:

連續(xù)的操作,需要花費忍無可忍的過長時間才可能完成
并行計算
為了等待網(wǎng)絡、文件系統(tǒng)、用戶或其他I/O響應而耗費大量的執(zhí)行時間
所以說,在動手之前,先保證自己的應用程序中是否出現(xiàn)了以上3種情形。

如果你的代碼運行得足夠快,但是你認為你能讓它運行得更快(假設你確實有這本事),我勸你最好不要接受這種誘惑。如果你不能肯定程序的計算操作并行性(例如針對同一數(shù)據(jù)表的并發(fā)數(shù)據(jù)庫更改——當你的數(shù)據(jù)庫達到了數(shù)據(jù)表級鎖定的情況下),那么再想想其他法子吧。還有,如果你不知道應用程序是否因為等待輸入或輸出而花費了過多的時間,那么請首先搞清楚真正耗費時間的情況再說。實際上,啟動3個線程以百萬分之一的步長計算圓周率所消耗的時間就比同一線程重復計算3次要長得多。為什么會出現(xiàn)這種失敗的情形呢?原因就在于,雖然第2條并行計算確實可用,但設計者卻恰恰忽略了以上第3個標準:并行計算可以用到的一次計算期間卻沒有空閑周期。

假如你在為一臺裝備了多個處理器的并行計算機編寫程序,則以上規(guī)則在這種情況下例外,你可以通過適當?shù)牟⑿胁僮髟O計而令軟件性能大大獲益——哪怕每一操作都對CPU時間極其貪婪。

基本的線程管理工具
剛才我已經(jīng)為多線程編程提出了相當程度的警告,同時還為何時使用或者不使用多線程提出了建議,接下來我對多線程編程所能利用的某些工具進行闡述。

Thread對象

.NET庫提供了一種名為System.Threading.Thread的對象,這種對象代表了單一線程。你可以啟動線程、在當前線程繼續(xù)運行的情況下設法完成線程的任務。這對那些需要打印文檔或者保存大型文件但希望獲得用戶確認請求并給用戶返回控制的應用程序來說幫助實在太大了。我們通過程序清單A演示了這一機制。

程序清單A


using System;
using System.Threading;
namespace Threads1 {
class Listing1 {
static void SayHello() { 
 Console.WriteLine("Hello, ");
 Thread.Sleep(750 /*mSec */);
 Console.WriteLine("World");
 }
static void Main(string[] args) {
Thread t1 = new Thread(new ThreadStartSayHello));
t1.Start();
Console.WriteLine("Thread started. Main done.");
}
 }
}




我們首先創(chuàng)建了一種方法:SayHello,由它完成我們的任務——顯示問候語。它的簽名必須匹配 System.Threading.ThreadStart指派(delegate)。注意,SayHello 方法調(diào)用了Thread.Sleep(int numMillisecs)方法。這是一種相當有用的構(gòu)造而且會經(jīng)常出現(xiàn)在這類示例中。

在主程序中,我們通過帶SayHello方法的ThreadStart指派創(chuàng)建了一個新線程,并在該線程上調(diào)用Start方法。我們創(chuàng)建的線程隨之被啟動,然后我們的主線程在這個例子中繼續(xù)運行到結(jié)束。

在很多情況下你可能要在各個線程中分別執(zhí)行存在輕微差別的任務,同時需要把某種參數(shù)從一種任務所在的線程傳遞給另一任務所在的線程。要完成這一目標可以采取好幾種合理的方式,最直接的做法就是創(chuàng)建一種Task對象,由它保存線程、特有的參數(shù)以及提供ThreadStart指派的worker方法。利用worker方法即可讀取所提供的參數(shù),因為它正好就是Task對象的成員所以對線程當然是唯一的。通過令線程成為一種公共字段,你就可以獲得訪問線程所有成員的權(quán)限而不必編寫額外的封裝代碼了。請參看程序清單B 閱讀這一技術的有關示例。

程序清單B
using System;
using System.Threading;
namespace TaskDemo {
 public class MyTask {
public Thread m_thread;
string m_name;
public MyTask(string name) {
m_name = name;
m_thread = new Thread(new ThreadStart(Worker));
 }
private void Worker() {
Console.WriteLine("Hello, ");
 Thread.Sleep(1500);
Console.WriteLine(m_name);
}
 } 
class TaskDemo1 {
 static void Main(string [] args){ 
 MyTask task1 = new MyTask("Bill");
 MyTask task2 = new MyTask("Steve");
 task1.m_thread.Start();
 task2.m_thread.Start();
 }
}
}




你甚至可以通過在保存線程的任務中定義字段的方法提供Task對象的某種返回值,在線程完成前設置這一返回值,最后在這項任務完成以后從啟動這項任務的線程讀取它。

你可以暫停一個線程、等待其他線程完成其任務。你可以在打算采集返回結(jié)果的時候執(zhí)行兩種操作,在三個分隔的線程之間執(zhí)行數(shù)據(jù)庫更新但直到所有線程都結(jié)束時才想進行數(shù)據(jù)處理也可以采用以上兩種操作。該技術如程序清單C所示。

程序清單C:
http://builder.com.com/utils/sidebar.jhtml?id=u00220020531pcb01.htm&index=3


這里,我們采用了程序清單A的代碼創(chuàng)建程序。這次我們運行兩個線程,每一個線程完成同以前一樣的任務。調(diào)用兩個線程的Start () 方法之后調(diào)用它們的Join()方法。對線程調(diào)用Join()方法會令調(diào)用線程暫停執(zhí)行直到被調(diào)用線程結(jié)束。因此thread1.Start ()方法會令主線程暫停直到thread1完成。然后我們對thread2執(zhí)行同樣的操作。結(jié)果,主線程直到thread1和 thread2都完成了才最后完成。

這個例子的思想分為兩部分。首先,某一個線程不能調(diào)用另一線程上的Join方法除非后者已經(jīng)啟動。第二,有多于兩種形式的Join可以設定調(diào)用線程繼續(xù)運行的超時時間哪怕被調(diào)用線程仍在運行。

計算機科學中經(jīng)常會提到看門狗概念,所謂看門狗(watchdog)其實就是負責保證功能正確性或者處理不正確功能的實體。另一種實體,也就是常用的看門狗計時器(watchdog timer)則通常負責保證另一任務在合理的時間內(nèi)按時完成。程序清單D所示就是實現(xiàn)看門狗計時器的簡單實現(xiàn)機制。

程序清單D:
http://builder.com.com/utils/sidebar.jhtml?id=u00220020531pcb01.htm&index=4

thread1啟動之后我們就加入該線程但提供了10秒鐘的超時時間。因為thread1內(nèi)置15秒暫停設置,所以在加入超期之后還會繼續(xù)存活。主線程則測試thread1.IsAlive,如果它還活動則終止線程。

同步和監(jiān)視器
同步指的是保證一次一節(jié)代碼中只有一個線程在執(zhí)行的措施。討論同步技術已經(jīng)超出了本文所涉及的主題范圍,但單個線程模塊之內(nèi)為可靠起見實際上會產(chǎn)生為數(shù)不少的構(gòu)造。然而,它們中的大多數(shù)在這些代碼塊的外部,在大多數(shù)時間內(nèi)都工作很正常,這樣,我們一直所熟知的“如果編譯通過并且得到我期望的答案那么它就是正確的”這種說法在這里就不一定成立了。這就是多線程為什么如此危險的部分原因。

監(jiān)視器是最基礎的同步構(gòu)造。任何對象都有自己關聯(lián)的監(jiān)視器,一個監(jiān)視器只能分配給一個對象。監(jiān)視器上有一個“鎖(lock)”,這個鎖可以在某一時刻被唯一線程獲得。在另一線程可以獲得這把鎖之前必須先釋放它。你可以聲明某個對象對所有線程可見來保護某一段代碼,比如類字段等。你還可以在實施某種操作之前讓某段代碼從監(jiān)視器那里獲得對象鎖,然后在操作完成之后釋放這把鎖。該構(gòu)造的示范如程序清單E所示。

程序清單E:
http://builder.com.com/utils/sidebar.jhtml?id=u00220020531pcb01.htm&index=5

這里我們聲明了一個對象myLockObject,該對象的唯一目的就是提供同步監(jiān)視器。在 SayHello方法中,無論何時只要需要我們就允許兩個線程打印出“Hello”的字樣。然而,現(xiàn)在我們就通過myMonitorObject所關聯(lián)的監(jiān)視器控制了“Wonderful”和“World”的打印,這樣,一個線程在被允許開始打印之前另一線程必須完成兩次打印。

實現(xiàn)以上機制還可以采用另兩種技術——lock()關鍵詞何MethodImplAttribute屬性。示例請參看程序清單F。

程序清單F:
http://builder.com.com/utils/sidebar.jhtml?id=u00220020531pcb01.htm&index=6

我們用lock(…){ … }代替Monitor.Enter(…) and Monitor.Exit(…)構(gòu)造。這些構(gòu)造在效果上是相同的,只不過后者相比前者更為便捷些。我們還增加了一個方法SayHello2 (),它具有屬性MethodImpl。這一屬性指定了將被同步的全部方法。實質(zhì)等價于在包含這些同步方法的類型對象被允許調(diào)用方法之前強迫調(diào)用代碼獲取類型對象關聯(lián)的監(jiān)視器上的鎖。這比在lock(){…}語句中封裝方法代碼可清楚多了。注意,文檔中定義該屬性為MethodImplAttribute,但它的實現(xiàn)卻叫做MethodImpl。根據(jù)聲明屬性的陳述習慣,也許微軟的某個開發(fā)人員自己可能沒注意到這一疏忽。

小結(jié)
這篇文章的內(nèi)容涵蓋很多方面的問題。我已經(jīng)討論了采用或者不采用多線程技術的若干理由,同時還展示了某些用在多線程編程中的原語構(gòu)造。此外我還介紹了線程對象并解釋了運行若干線程完成任務的原理、什么是監(jiān)視器以及如何通過監(jiān)視器的使用完成代碼的同步。在特定的情況下,lock關鍵詞和MethodImpl屬性完成同樣的工作。

在后續(xù)的文章里我將繼續(xù)描述其它基本構(gòu)造,實現(xiàn)一個線程池,并且探討更多的構(gòu)造類型, 例如線程本地存儲和重疊I/O等。



溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

狠狠爱成人网_日韩一级在线_国产综合自拍_亚洲精品韩国_亚洲视频导航_麻豆成人在线播放_欧美jjzz_一区在线视频观看_美脚丝袜一区二区三区在线观看_欧美91视频
久久亚洲风情| 亚洲精品在线一区二区| 国产欧美精品久久| 精品99视频| 激情视频一区二区| 亚洲国产精品一区二区第四页av| 色综合久久综合网97色综合| 欧美在线视频一区二区三区| 欧美激情视频一区二区三区免费| 99久久99久久综合| 午夜精品亚洲| 亚洲国产婷婷| 免费在线欧美黄色| 在线观看免费一区| 欧美精品v日韩精品v韩国精品v| 欧美日韩卡一卡二| 日韩美一区二区三区| 国产偷v国产偷v亚洲高清| 亚洲国产精品传媒在线观看| 国产精品九色蝌蚪自拍| 亚洲综合成人网| 蜜乳av一区二区三区| 国产福利91精品一区| 91看片淫黄大片一级| 亚洲欧洲日本mm| 欧美性做爰猛烈叫床潮| 欧美大片拔萝卜| 亚洲图片你懂的| 青娱乐精品视频在线| 国产凹凸在线观看一区二区 | 欧美激情第六页| 国产精品亚洲一区| 91精品国产一区二区| 国产人成亚洲第一网站在线播放 | 国内揄拍国内精品久久| 美日韩在线观看| 日韩午夜电影av| 亚洲日穴在线视频| 韩国v欧美v亚洲v日本v| 欧美破处大片在线视频| 性一交一乱一区二区洋洋av| 在线综合亚洲欧美在线视频| 国产精品成人在线观看| 麻豆成人久久精品二区三区红| av亚洲精华国产精华精华 | 亚洲视频 欧洲视频| 麻豆免费看一区二区三区| av成人免费在线观看| 香蕉亚洲视频| 久久久久9999亚洲精品| 日韩在线播放一区二区| 92国产精品观看| 色婷婷亚洲精品| 国产精品视频一二三| 另类中文字幕网| 国产日韩欧美一区二区三区在线观看| 在线不卡的av| 亚洲国产日韩一区二区| 91在线看国产| 欧美色图天堂网| 亚洲欧洲日本在线| 国产在线视频一区二区| 亚洲另类黄色| 国产亚洲精品7777| 国产一区二区0| 久久国产精品99国产| 国产日韩三级在线| 国产一区二区三区黄视频| 午夜一区二区三区不卡视频| 精品国产成人系列| 久久国产精品99久久久久久老狼| 在线观看欧美一区| 国产三级一区二区| 国产很黄免费观看久久| 欧美午夜免费电影| 亚洲国产精品久久久久婷婷884| 91在线视频播放| 欧美一区二区啪啪| 精品综合免费视频观看| 久久在线视频| 亚洲福利一区二区三区| 日韩午夜黄色| 亚洲欧洲韩国日本视频| 99精品在线免费| 精品久久久网站| 国产91露脸合集magnet| 欧美另类一区二区三区| 久久国内精品自在自线400部| 免费精品视频| 亚洲一区二区三区影院| 99精品久久| 亚洲免费色视频| 最新日韩欧美| 樱花影视一区二区| 亚洲视频导航| 亚洲国产裸拍裸体视频在线观看乱了| 在线欧美不卡| 一区二区三区在线高清| 亚洲成色最大综合在线| 亚洲欧美日韩国产另类专区| 好吊视频一区二区三区四区 | 久久精品国产精品亚洲红杏| 欧美自拍偷拍午夜视频| 麻豆国产欧美日韩综合精品二区| 欧美性色综合网| 久久99最新地址| 欧美一级一区二区| eeuss影院一区二区三区| 久久蜜桃一区二区| 欧美日韩一视频区二区| 国产精品第四页| 国产精品三区www17con| 五月激情丁香一区二区三区| 91国偷自产一区二区三区成为亚洲经典| 日日摸夜夜添夜夜添精品视频| 午夜综合激情| 国产精品一区二区在线观看网站 | 理论片日本一区| 日韩欧美中文字幕公布| 欧美一区不卡| 亚洲国产综合色| 久久久久久精| 久久69国产一区二区蜜臀| 日韩欧美亚洲一区二区| 欧美视频久久| 亚洲超碰97人人做人人爱| 欧美三级日本三级少妇99| 波多野结衣在线一区| 亚洲视频香蕉人妖| 欧美性一区二区| 99国产欧美久久久精品| 亚洲愉拍自拍另类高清精品| 欧美在线视频全部完| 99久久99久久免费精品蜜臀| 亚洲精品欧美综合四区| 欧美色图第一页| 国产精品国产三级欧美二区| 日韩精品欧美精品| 日韩视频一区在线观看| 亚洲激情影院| 国内久久精品视频| 亚洲欧美综合网| 色综合久久久久久久久久久| 成人激情小说乱人伦| 亚洲在线视频一区| 日韩美女在线视频| 欧美专区一区二区三区| 99久久夜色精品国产网站| 亚洲国产精品一区二区久久恐怖片| 91超碰这里只有精品国产| 亚洲激情婷婷| 豆国产96在线|亚洲| 亚洲一级二级在线| 久久午夜色播影院免费高清| 亚洲一区欧美激情| 91亚洲精品久久久蜜桃网站| 丝袜诱惑制服诱惑色一区在线观看 | 99国产欧美久久久精品| 日韩高清不卡在线| 国产精品美女久久久久av爽李琼| 91成人在线观看喷潮| 国产一区二区三区四区老人| 国产一区二区三区香蕉| 亚洲午夜激情网页| 欧美激情在线免费观看| 91精品国产综合久久久久| 国产精品日本欧美一区二区三区| 成人免费视频视频在线观看免费| 亚洲国产成人精品视频| 国产亚洲一区字幕| 制服丝袜中文字幕一区| 午夜一区不卡| 亚洲国产免费看| 欧美成人中文| 成人国产视频在线观看| 美女视频免费一区| 性感美女久久精品| 亚洲人成网站在线| 国产精品黄色在线观看| 精品国产免费视频| 91精品国产综合久久久久久漫画| 亚洲欧美日韩精品一区二区| 亚洲啪啪91| 亚洲性感激情| 欧美日韩免费精品| 99精品国产一区二区三区不卡| 精品一区二区三区在线观看| 视频在线观看91| 午夜av一区二区三区| 亚洲精品福利视频网站| 亚洲欧洲综合另类在线| 国产精品久久久一区麻豆最新章节| 欧美变态tickle挠乳网站| 91麻豆精品国产综合久久久久久| 欧美亚洲国产怡红院影院| 91久久奴性调教| 91国偷自产一区二区开放时间| 久久综合九色99| 色偷偷一区二区三区| 日本乱人伦aⅴ精品|