可視化程序設(shè)計(jì).多線程技術(shù)_第1頁(yè)
可視化程序設(shè)計(jì).多線程技術(shù)_第2頁(yè)
可視化程序設(shè)計(jì).多線程技術(shù)_第3頁(yè)
可視化程序設(shè)計(jì).多線程技術(shù)_第4頁(yè)
可視化程序設(shè)計(jì).多線程技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

2024/4/29可視化程序設(shè)計(jì)主講:周建偉1內(nèi)容提要進(jìn)程與線程的概念應(yīng)用程序域在C#中使用多線程線程同步問(wèn)題線程同步的基本方法進(jìn)程與線程的基本概念2024/4/293進(jìn)程正在執(zhí)行的程序稱為進(jìn)程。與進(jìn)程相關(guān)的信息包括:進(jìn)程標(biāo)示(進(jìn)程ID)、文件名、執(zhí)行的程序和數(shù)據(jù),運(yùn)行時(shí)間、在存儲(chǔ)器中的位置、占用的內(nèi)存容量等。線程將一個(gè)進(jìn)程劃分為若干個(gè)獨(dú)立的執(zhí)行流,每一個(gè)執(zhí)行流均稱為一個(gè)線程。(1)線程是CPU調(diào)度和分配的基本單位。(2)每個(gè)進(jìn)程都有一個(gè)主線程。(3)除了主線程以外,還可以給一個(gè)進(jìn)程分配若干個(gè)子線程,從而達(dá)到多個(gè)任務(wù)并行執(zhí)行的目的。進(jìn)程(超市)食品服裝體育用品文具數(shù)據(jù)(商品)線程(收銀臺(tái))CPU(收銀員)多線程應(yīng)用程序域AppDomain把進(jìn)程的4G空間又做了劃分把一個(gè)大屋子進(jìn)一步隔成多個(gè)小屋子從這個(gè)意義上,AppDomain是“亞進(jìn)程”兩個(gè)應(yīng)用程序域占用獨(dú)立的數(shù)據(jù)空間,且不能互相訪問(wèn)地址不能相同,因?yàn)樵谕粋€(gè)進(jìn)程里面代碼空間可以重疊,相當(dāng)于一個(gè)程序啟動(dòng)多遍線程同一時(shí)刻只能在一個(gè)應(yīng)用程序域中運(yùn)行默認(rèn)的AppDomain是整個(gè)進(jìn)程空間食品AppDomain(承包區(qū))進(jìn)程(超市)服裝AppDomain家電AppDomain線程仍直屬進(jìn)程,它們可以先后運(yùn)行于不同的AppDomain(收款臺(tái)直屬超市收完買服裝的再收買食品的)進(jìn)程管理(Process類)2024/4/297Process類常用的屬性和方法-----------------------獲取進(jìn)程實(shí)例-------------------GetProcessById方法(靜態(tài)方法):通過(guò)進(jìn)程Id創(chuàng)建新的Process組件,并將其與本地計(jì)算機(jī)上的進(jìn)程資源關(guān)聯(lián)。GetProcessById最多只有一個(gè)Process實(shí)例。GetProcesses方法(靜態(tài)方法):獲取本機(jī)所有進(jìn)程GetProcessesByName方法(靜態(tài)方法):獲取本機(jī)上特定名稱的進(jìn)程-----------------------獲取及設(shè)置優(yōu)先級(jí)---------------BasePriority屬性:獲取進(jìn)程優(yōu)先級(jí)(只讀)PriorityClass屬性:設(shè)置或更改進(jìn)程優(yōu)先級(jí)進(jìn)程管理(Process類)2024/4/298---------------------------進(jìn)程ID及進(jìn)程名-----------------------Id屬性:獲取關(guān)聯(lián)進(jìn)程的唯一標(biāo)識(shí)符ProcessName屬性:獲取該進(jìn)程的名稱,不包括路徑和擴(kuò)展名-----------------------------進(jìn)程其他信息-------------------------------MachineName屬性:獲取關(guān)聯(lián)進(jìn)程正在其上運(yùn)行的計(jì)算機(jī)名稱MainModule屬性:獲取關(guān)聯(lián)進(jìn)程的主模塊Modules屬性:獲取由關(guān)聯(lián)進(jìn)程加載的模塊TotalProcessorTime屬性:獲取進(jìn)程的總的處理器時(shí)間StartTime屬性:獲取關(guān)聯(lián)進(jìn)程的啟動(dòng)時(shí)間WorkingSet64屬性:為進(jìn)程分配的物理內(nèi)存量(字節(jié)數(shù))進(jìn)程管理(Process類)2024/4/299-----------------------進(jìn)程啟動(dòng)-------------------------Start方法:?jiǎn)?dòng)進(jìn)程資源并將其與Process組件關(guān)聯(lián)StartInfo屬性:獲取或設(shè)置要傳遞給啟動(dòng)進(jìn)程的文件名以及啟動(dòng)參數(shù)-----------------------進(jìn)程終止-------------------------Kill方法:強(qiáng)制終止進(jìn)程CloseMainWindow方法:關(guān)閉具有用戶界面的進(jìn)程Close方法:釋放與此組件關(guān)聯(lián)的所有資源HasExited屬性:指示關(guān)聯(lián)進(jìn)程是否已終止WaitForExit方法:設(shè)置等待關(guān)聯(lián)進(jìn)程退出的時(shí)間,并在該段時(shí)間結(jié)束前或該進(jìn)程退出前,阻止當(dāng)前線程執(zhí)行。獲取進(jìn)程信息2024/4/29101、如何獲取進(jìn)程信息(1)獲取本地計(jì)算機(jī)的所有進(jìn)程:

Process[]myProcesses=Process.GetProcesses();(2)獲取本地計(jì)算機(jī)上指定名稱的進(jìn)程:

Process[]myProcesses=

Process.GetProcessesByName("進(jìn)程名稱");注意:(a)進(jìn)程名稱不帶擴(kuò)展名。(b)可以是任何一個(gè)可執(zhí)行文件例如:

Process[]myProcesses=Process.GetProcessesByName("WindowApplication1");獲取進(jìn)程信息2024/4/2911(3)獲取遠(yuǎn)程計(jì)算機(jī)的所有進(jìn)程:Process[]myProcesses=Process.GetProcesses(remoteMachineName);例如:

Process[]myProcesses=

Process.GetProcesses("");(4)獲取遠(yuǎn)程計(jì)算機(jī)上指定名稱的進(jìn)程:

Process[]myProcesses=Process.GetProcessesByName("遠(yuǎn)程進(jìn)程名稱",remoteMachineName);啟動(dòng)和停止進(jìn)程2024/4/29121.啟動(dòng)進(jìn)程:方法1:(1)創(chuàng)建一個(gè)Process組件的實(shí)例,例如:

ProcessmyProcess=newProcess();(2)設(shè)置其對(duì)應(yīng)的StartInfo屬性,指定要運(yùn)行的應(yīng)用程序名以及傳遞的參數(shù):

myProcess.StartInfo.FileName="文件名";

process1.StartInfo.Arguments="參數(shù)";如果該進(jìn)程帶有圖形用戶界面,也可以指定圖形用戶界面的打開方式。例如:

myProcess.StartInfo.WindowStyle=ProcessWindowStyle.Normal;(3)調(diào)用該實(shí)例的Start方法啟動(dòng)該進(jìn)程。方法2:

直接調(diào)用Process類提供的靜態(tài)方法啟動(dòng)進(jìn)程。啟動(dòng)和停止進(jìn)程2024/4/29132.停止進(jìn)程通過(guò)兩種方法利用Process組件停止進(jìn)程。(1)如果進(jìn)程有圖形用戶界面,調(diào)用CloseMainWindow方法。(2)如果進(jìn)程沒(méi)有用戶界面,調(diào)用進(jìn)程的Kill方法。不論有沒(méi)有圖形用戶界面,如果希望強(qiáng)行讓其退出,在權(quán)限允許的情況下,均可以調(diào)用Kill方法終止該進(jìn)程。線程管理(Thread類)2024/4/2914Thread類位于System.Threading命名空間下。Thread類是用于創(chuàng)建和控制線程的,對(duì)線程的常用操作有:?jiǎn)?dòng)線程、終止線程、合并線程和讓線程休眠等。Thread類提供的常用屬性IsAlive屬性:獲取一個(gè)值,該值指示當(dāng)前線程的執(zhí)行狀態(tài)。如果此線程已啟動(dòng)并且尚未正常終止,則為true;否則為falseIsBackground屬性:獲取或設(shè)置一個(gè)值,該值指示某個(gè)線程是否為后臺(tái)線程。是后臺(tái)線程或即將成為后臺(tái)線程,則為true;否則為falsePriority屬性:獲取或設(shè)置一個(gè)值,該值指示線程的調(diào)度優(yōu)先級(jí)線程管理(Thread類)2024/4/2915Thread類提供的常用方法Start方法:?jiǎn)?dòng)線程Join方法:將指定的線程合并到當(dāng)前線程中,并阻止當(dāng)前線程執(zhí)行,直到指定的線程終止或經(jīng)過(guò)了指定的時(shí)間為止Sleep方法:將當(dāng)前線程阻止指定的毫秒數(shù),零(0)表示應(yīng)掛起此線程以使其他等待線程能夠執(zhí)行Abort方法:在調(diào)用此方法的線程上引發(fā)ThreadAbortException,以開始終止此線程的過(guò)程。調(diào)用此方法通常會(huì)終止線程前臺(tái)線程和后臺(tái)線程2024/4/2916一個(gè)線程要么是后臺(tái)線程要么是前臺(tái)線程。后臺(tái)線程與前臺(tái)線程類似,區(qū)別是后臺(tái)線程不會(huì)影響進(jìn)程終止。屬于某個(gè)進(jìn)程的所有前臺(tái)線程都終止后,公共語(yǔ)言運(yùn)行庫(kù)就會(huì)結(jié)束該進(jìn)程,而且所有屬于該進(jìn)程的后臺(tái)線程也都會(huì)立即停止,而不管后臺(tái)工作是否完成。利用Thread對(duì)象的IsBackground屬性,可以設(shè)置或判斷一個(gè)線程是后臺(tái)線程還是前臺(tái)線程。通過(guò)將某個(gè)線程的IsBackground屬性設(shè)置為true,使其變?yōu)楹笈_(tái)線程。默認(rèn)情況下,屬于托管線程池的線程(即其IsThreadPoolThread屬性為true的線程)都是后臺(tái)線程,通過(guò)創(chuàng)建并啟動(dòng)新的Thread對(duì)象而生成的線程都是前臺(tái)線程。線程的基本操作2024/4/29171.啟動(dòng)線程啟動(dòng)線程前,首先要?jiǎng)?chuàng)建一個(gè)線程。創(chuàng)建無(wú)參數(shù)線程的一般形式為:

Threadt1=newThread(線程名);創(chuàng)建帶參數(shù)線程的一般形式為(傳遞一個(gè)Object類型的參數(shù)):

Threadt2=newThread(線程名(Objectobj));創(chuàng)建線程實(shí)例后,就可以調(diào)用Start方法啟動(dòng)線程了。例如:

t1.Start();//不帶參數(shù)

t2.Start(“myClass”);//帶參數(shù)注意:調(diào)用Start只是告訴系統(tǒng)啟動(dòng)該線程,但是系統(tǒng)并不一定會(huì)立即啟動(dòng)它。線程的基本操作2024/4/29182.終止線程

兩種方法:事先設(shè)置一個(gè)布爾字段,在其他線程中通過(guò)修改該布爾量的值作為傳遞給該線程是否需要終止的判斷條件,而在該線程中循環(huán)判斷該布爾值,以確定是否退出線程,這是結(jié)束線程比較好的方法,實(shí)際應(yīng)用中一般使用這種方法。調(diào)用Thread類的Abort方法,該方法的最終效果是強(qiáng)行終止線程。線程的基本操作2024/4/29193.暫停線程在多線程應(yīng)用程序中,有時(shí)候并不希望某一個(gè)線程繼續(xù)執(zhí)行,而是希望該線程暫停一段時(shí)間,這樣,CPU就會(huì)將其時(shí)間片中剩余的部分讓給另一個(gè)線程。調(diào)用Thread類的Sleep方法可以實(shí)現(xiàn)這個(gè)功能。例如:

Thread.Sleep(1000);

這條語(yǔ)句的功能是讓當(dāng)前線程暫停1000毫秒。注意

Sleep方法是靜態(tài)方法,暫停的是該語(yǔ)句所在的線程,而不是其他線程。線程的基本操作2024/4/29204.合并線程Join方法用于把指定的線程合并到當(dāng)前線程中,從而使其變?yōu)橐粋€(gè)單個(gè)的線程。如果一個(gè)線程t1在執(zhí)行的過(guò)程中需要等待另一個(gè)線程t2結(jié)束后才能繼續(xù)執(zhí)行,可以在t1的代碼塊中調(diào)用t2的join方法。例如:

t2.Join();

功能:t1在執(zhí)行到t2.Join()語(yǔ)句后,就處于暫停狀態(tài),直到t2結(jié)束后才會(huì)繼續(xù)執(zhí)行。為了避免t1一直等待,可以在調(diào)用t2的Join方法的時(shí)候指定一個(gè)暫停時(shí)間,例如:t2.Join(100);在一個(gè)線程中操作另一個(gè)線程的控件2024/4/2921默認(rèn)情況下,在Windows應(yīng)用程序中,.NETFramework不允許在一個(gè)線程中直接操作另一個(gè)線程中的控件,這是因?yàn)樵L問(wèn)Windows窗體控件本質(zhì)上不是線程安全的。在應(yīng)用程序中,如果創(chuàng)建某控件的線程之外的其他線程試圖調(diào)用該控件,則系統(tǒng)會(huì)引發(fā)一個(gè)InvalidOperationException異常。有兩種辦法可以解決這個(gè)問(wèn)題:(1)使用委托(delegate)操作另一個(gè)線程中的控件(2)用BackgroundWorker組件在后臺(tái)執(zhí)行線程在一個(gè)線程中操作另一個(gè)線程的控件(續(xù))2024/4/2922利用委托調(diào)用另一個(gè)線程控件(方法1):delegatevoidAppendStringDelegate(stringstr);privatevoidAppendString(stringstr){

if(richTextBox1.InvokeRequired){

AppendStringDelegated=AppendString;richTextBox1.Invoke(d,str);}

else{richTextBox1.Text+=str;}}2024/4/2923利用委托調(diào)用另一個(gè)線程控件(方法2):privatedelegatevoidAppendStringDelegate(string

str);publicvoidAppendString(stringstr){richTextBox1.BeginInvoke(

newAppendStringDelegate(AddMessageToRichTextBox),

newObject[]{message});}privatevoidAddMessageToRichTextBox(stringmessage){richTextBox1.AppendText(message);}線程的優(yōu)先級(jí)2024/4/2924五個(gè)優(yōu)先級(jí),由高到低分別是:Highest、AboveNormal、

Normal(默認(rèn))、BelowNormal和Lowest可以使用下面的方法為其賦予較高的優(yōu)先級(jí):

Threadt=newThread(MethodName);t.priority=ThreadPriority.AboveNormal;通過(guò)設(shè)置線程的優(yōu)先級(jí)可以改變線程的執(zhí)行順序,所設(shè)置的優(yōu)先級(jí)僅僅適用于這些線程所屬的進(jìn)程。注意:當(dāng)把某線程的優(yōu)先級(jí)設(shè)置為Highest時(shí),系統(tǒng)正在運(yùn)行的其他線程都會(huì)終止,所以使用這個(gè)優(yōu)先級(jí)別時(shí)要特別小心。線程同步2024/4/2925為什么要同步 如果不同步,線程訪問(wèn)共享資源時(shí)可能出錯(cuò)對(duì)象讀取讀取寫入寫入線程的數(shù)據(jù)訪問(wèn)線程體是代碼,代碼要訪問(wèn)數(shù)據(jù)兩個(gè)線程同時(shí)要求訪問(wèn)同一個(gè)數(shù)據(jù)?DataSetds=CreateDataSet();//......dataGridView1.DataSource=ds;DataSetds=CreateDataSet();foreach(DataTabledtinds.Tables{//....}ds.Tables.Add(newDataTable())//....//.....線程同步確保進(jìn)程內(nèi)的一個(gè)資源不能同時(shí)被寫同時(shí)寫,結(jié)果不可預(yù)知可以同時(shí)讀,因?yàn)閿?shù)據(jù)并不改變寫的時(shí)候也不能讀,數(shù)據(jù)不完整策略:確保寫操作只有一個(gè)線程可執(zhí)行。一個(gè)線程寫的時(shí)候,其它線程全阻止(不能讀也不能寫)寫完后,允許其它線程訪問(wèn)。如果下一個(gè)訪問(wèn)的線程也是寫,則又一次阻止除自己外的所有線程沒(méi)人寫,不限制。線程同步2024/4/2928解決方法:System.Threading命名空間提供了多個(gè)用于同步線程的類這些類包括Mutex、Monitor、Interlocked等。在實(shí)際應(yīng)用中經(jīng)常使用lock語(yǔ)句完成線程同步。 該語(yǔ)句簡(jiǎn)化了編程的復(fù)雜性,使程序看起來(lái)既清晰又簡(jiǎn)潔一種簡(jiǎn)單的同步辦法classProgram{staticboolcanRead=true;staticboolcanWrite=true;staticvoidMain(string[]args){Threadread1=newThread(ReadThread);read1.Start();Threadread2=newThread(ReadThread);read2.Start();Threadwrite1=newThread(WriteThread);read1.Start();Threadwrite2=newThread(WriteThread);write2.Start();}

staticpublicvoidWriteThread(){

if(canWrite){

canWrite=false;

canRead=false;//寫數(shù)據(jù)

}

canWrite=true;

canRead=true;}staticpublicvoidReadThread(){

if(canRead){

canWrite=false;//讀數(shù)據(jù)

}

canWrite=true;}}問(wèn)題:非原子操作if(canWrite){canWrite=false//...}moveax,canWritecmpeax,0jleexitmoveax,-1movcanWrite,eax....exit:retmoveax,canWritecmpeax,0jleexitmoveax,-1movcanWrite,eax....exit:ret將某些操作為原子操作仍是多行代碼,看作一個(gè)原子操作Interlocked類AddCompareExchangeDecrementExchangeIncrementReadInterlocked.AddAdd(int,int)將一次整數(shù)加法作為原子操作進(jìn)行結(jié)果放在第一個(gè)參數(shù)中不會(huì)出現(xiàn)加法做完一半的情況Interlocked.CompareExchangeCompareExchange(refintp1,intvalue,intp2);如果p1==p2,就p1=value,并返回原來(lái)p1的值同樣,原子操作。改進(jìn)的簡(jiǎn)單的同步辦法classProgram{staticint

canRead=1;staticint

canWrite=1;staticvoidMain(string[]args){Threadread1=newThread(ReadThread);read1.Start();Threadread2=newThread(ReadThread);read2.Start();Threadwrite1=newThread(WriteThread);read1.Start();Threadwrite2=newThread(WriteThread);write2.Start();}

staticpublicvoidWriteThread(){

if(canWrite==1){

Interlocked.Add(canWrite,-1);Interlocked.Add(canRead,-1);

//canWrite=false;

canRead=false;//寫數(shù)據(jù)}

Interlocked.Add(canWrite,-1);Interlocked.Add(canRead,-1);//

canWrite=true;

canRead=true;}仍存在的問(wèn)題對(duì)canWrite和canRead的操作仍不是原子的canWrite==1的比較,也不是原子的

staticpublicvoidWriteThread(){

if(canWrite==1){

Interlocked.Add(canWrite,-1);Interlocked.Add(canRead,-1);

//canWrite=false;

canRead=false;//寫數(shù)據(jù)}

Interlocked.Add(canWrite,-1);Interlocked.Add(canRead,-1);//

canWrite=true;

canRead=true;}lock語(yǔ)句2024/4/2936lock語(yǔ)句的功能

lock語(yǔ)句代碼段(語(yǔ)句塊)標(biāo)記為臨界區(qū)。它能確保當(dāng)一個(gè)線程位于代碼的臨界區(qū)(可以理解為一段代碼)時(shí),另一個(gè)線程不進(jìn)入臨界區(qū)。如果其他線程試圖進(jìn)入鎖定的代碼段,則它將一直等待(即被阻塞),直到鎖定的對(duì)象被釋放以后才能進(jìn)入臨界區(qū)。lock語(yǔ)句的用法首先利用lock語(yǔ)句鎖定某一個(gè)對(duì)象,然后執(zhí)行代碼段中的語(yǔ)句,等代碼段中的語(yǔ)句執(zhí)行完畢后,再釋放該對(duì)象。privateObjectobj=newObject();……lock(obj){//臨界區(qū)中的代碼}lock語(yǔ)句2024/4/2937使用lock語(yǔ)句應(yīng)注意的問(wèn)題:鎖定的對(duì)象名(上面代碼中的obj)一般聲明為Object類型,不要將其聲明為值類型。鎖定的對(duì)象名不能將其聲明為public,只能為private臨界區(qū)中的代碼一般不宜太多。線程池2024/4/2938背景:

1)無(wú)限制的創(chuàng)建線程消耗系統(tǒng)資源

2)創(chuàng)建線程、回收線程均需要時(shí)間線程池:是在后臺(tái)執(zhí)行多個(gè)任務(wù)的線程集合。

1)最大線程數(shù)限制。如果所有線程都繁忙,則額外的任務(wù)將放入等待隊(duì)列中,直到有線程可用時(shí)才能夠得到處理。

2)最小線程數(shù)=創(chuàng)建線程池時(shí)應(yīng)立即啟動(dòng)的數(shù)目

3)一旦池中的某個(gè)線程完成任務(wù),它將返回到等待線程隊(duì)列中,等待被再次使用。這種重用使應(yīng)用程序可以避免為每個(gè)任務(wù)創(chuàng)建新線程引起的資源和時(shí)間消耗。

4)一項(xiàng)工作任務(wù)被加入到線程池的隊(duì)列中,就不能取消該任務(wù),直到該任務(wù)完成。線程池2024/4/2939為什么要用線程池?降低系統(tǒng)開銷可以重用資源,使應(yīng)用程序可以避免為每個(gè)任務(wù)創(chuàng)建新線程引起的資源和時(shí)間消耗。什么情況下才使用線程池?后臺(tái)執(zhí)行,而且不同線程沒(méi)有優(yōu)先級(jí)區(qū)別適用于需要多個(gè)線程而實(shí)際執(zhí)行時(shí)間又不多的場(chǎng)合沒(méi)有導(dǎo)致線程長(zhǎng)時(shí)間被阻塞的任務(wù)(對(duì)于可能長(zhǎng)時(shí)間被阻塞的任務(wù),應(yīng)該創(chuàng)建單獨(dú)的線程處理,不應(yīng)該使用線程池),這是因?yàn)榫€程池具有最大線程數(shù)限制,大量阻塞的線程池線程可能會(huì)阻止任務(wù)啟動(dòng)線程池

2024/4/2940ThreadPool類位于System.Threading命名空間下。ThreadPool提供了對(duì)線程池的操作(靜態(tài)方法),例如:發(fā)送工作項(xiàng)、處理異步I/O、設(shè)置線程數(shù)目等ThreadPool是一個(gè)靜態(tài)類托管線程池中的線程為后臺(tái)線程,即它們的IsBackground屬性為true。這意味著在所有的前臺(tái)線程都已退出后,ThreadPool線程也會(huì)自動(dòng)退出線程池2024/4/2941GetAvailableThreads方法:檢索由GetMaxThreads返回的線程池線程的最大數(shù)目和當(dāng)前活動(dòng)數(shù)目之間的差值GetMaxThreads方法:檢索可以同時(shí)處于活動(dòng)狀態(tài)的線程池請(qǐng)求的數(shù)目。所有大于此數(shù)目的請(qǐng)求將保持排隊(duì)狀態(tài),直到線程池線程變?yōu)榭捎肎etMinThreads方法:檢索線程池在新請(qǐng)求預(yù)測(cè)中維護(hù)的空閑線程數(shù)SetMaxThreads方法:可以同時(shí)處于活動(dòng)狀態(tài)的線程池的請(qǐng)求數(shù)目。所有大于此數(shù)目的請(qǐng)求將保持排隊(duì)狀態(tài),直到線程池線程變?yōu)榭捎?。SetMinThreads方法:設(shè)置線程池在新請(qǐng)求預(yù)測(cè)中維護(hù)的空閑線程數(shù)線程池2024/4/2942QueueUserWorkItem方法功能:功能:請(qǐng)求線程池處理一個(gè)任務(wù)或者工作項(xiàng)運(yùn)行時(shí)線程池會(huì)自動(dòng)為每一個(gè)任務(wù)創(chuàng)建線程并且在任務(wù)釋放時(shí)釋放線程。語(yǔ)法:帶一個(gè)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論