国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
《CLR via C#》讀書(shū)筆記

《CLR via C#》讀書(shū)筆記-.NET多線程(三)

作者:zlbcdn

CLR線程池基礎(chǔ)
1、每一個(gè)CLR有一個(gè)線程池
2、應(yīng)用程序申請(qǐng)線程池的流程。線程池的最開(kāi)始是沒(méi)有線程的。線程池會(huì)有一個(gè)請(qǐng)求隊(duì)列。當(dāng)應(yīng)用程序請(qǐng)求一個(gè)線程的時(shí)候,CLR會(huì)調(diào)用某個(gè)方法,將請(qǐng)求放入線程池的請(qǐng)求隊(duì)列中。然后線程池會(huì)創(chuàng)建新的線程后,將應(yīng)用程序請(qǐng)求dispatch至新建的線程。若線程完成應(yīng)用的請(qǐng)求后,線程會(huì)返還至線程池中,等待新的任務(wù)請(qǐng)求。若一直沒(méi)有新的請(qǐng)求,則線程會(huì)自動(dòng)終結(jié)。另外,線程池中的線程并不是為每一個(gè)請(qǐng)求創(chuàng)建一個(gè)新的線程,其創(chuàng)建線程的邏輯應(yīng)該根據(jù)任務(wù)請(qǐng)求數(shù)量,以及根據(jù)一個(gè)timeout值進(jìn)行判斷的。
3、線程池中線程的分類。線程池中默認(rèn)分為工作者線程和I/O線程。其中工作者線程是平時(shí)用的最多的。例如:在往多個(gè)數(shù)據(jù)庫(kù)表從插入數(shù)據(jù),數(shù)據(jù)多、量大、耗時(shí)長(zhǎng),這時(shí)線程是一個(gè)往數(shù)據(jù)庫(kù)服務(wù)器上硬盤(pán)寫(xiě)入數(shù)據(jù)的I/O操作。I/O線程是一個(gè)通知線程,通知你的代碼一個(gè)異步的I/O操作完成了。
多線程做的事情有很多種:讀取寄存器中的數(shù)據(jù)進(jìn)行異步處理、讀取內(nèi)存的數(shù)據(jù)進(jìn)行異步處理、讀取本機(jī)硬盤(pán)及其他服務(wù)器上的硬盤(pán)進(jìn)行的異步處理。讀取硬盤(pán)相關(guān)的異步處理就是一個(gè)I/O操作。
ThreadPool
ThreadPool類是CLR提供的一個(gè)線程池,本類沒(méi)有屬性,只有方法
在使用ThreadPool中最常用的方法及相關(guān)方法如下:
1、QueueUserWorkItem方法。
本方法是指:向線程池的隊(duì)列中添加“待辦事項(xiàng)”,添加完成后,線程立刻返回,而在“待辦事項(xiàng)”中的這個(gè)方法需要等到線程池中有可用線程時(shí),才會(huì)執(zhí)行。即線程池不會(huì)創(chuàng)建為該方法而創(chuàng)建新的線程,而是等到有空閑線程時(shí),才執(zhí)行本方法。MSDN的解釋如下:

Queues a method for execution, and specifies an object containing data to be used by the method.The method executes when a thread pool thread becomes available.
  • 1

方法的具體形式如下:

public static bool QueueUserWorkItem(WaitCallback callBack)public static bool QueueUserWorkItem(WaitCallback callBack,object state)
  • 1
  • 2

其中 callBack 的委托定義如下:

[ComVisibleAttribute(true)]public delegate void WaitCallback(object state)
  • 1
  • 2

這兒對(duì)QueueUserWorkItem的第二個(gè)方法,第二個(gè)方法的參數(shù)是object,這個(gè)很關(guān)鍵。這個(gè)參數(shù)不僅可以傳入回調(diào)方法或者是委托的參數(shù)值,更可以傳入CancellationTokenSource,用作取消操作。詳細(xì)可見(jiàn)“《CLR via C#》讀書(shū)筆記-.NET多線程(四)”
2、設(shè)定threadpool的線程數(shù)
以下的幾個(gè)方法時(shí)設(shè)定或獲取workerThread和I/O completionPortThreads的數(shù)量

public static void GetAvailableThreads(out int workerThreads,out int completionPortThreads)public static void GetMaxThreads(out int workerThreads,out int completionPortThreads)public static bool SetMaxThreads(int workerThreads,int completionPortThreads)public static void GetMinThreads(out int workerThreads,out int completionPortThreads)public static bool SetMinThreads(int workerThreads,int completionPortThreads)
  • 1
  • 2
  • 3
  • 4
  • 5

3、RegisterWaitForSingleObject方法
在ThreadPool中還有一系列的RegisterWaitForSingleObject方法,以其中的一個(gè)為例:

public static RegisteredWaitHandle RegisterWaitForSingleObject(    WaitHandle waitObject,    WaitOrTimerCallback callBack,    object state,    int millisecondsTimeOutInterval,    bool executeOnlyOnce)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

方法的參數(shù)如下:

waitObject    The WaitHandle to register.Use a WaitHandle other than Mutex.callBack    The WaitOrTimerCallback delegate to call when the waitObject parameter is signaled. state    The object that is passed to the delegate. millisecondsTimeOutInterval    The time-out in milliseconds.If the millisecondsTimeOutInterval parameter is 0 (zero), the      function tests the object's state and returns immediately.If millisecondsTimeOutInterval is -1,     the function's time-out interval never elapses.executeOnlyOnce    true to indicate that the thread will no longer wait on the waitObject parameter after the delegate has been called; false to indicate that the timer is reset every time the wait operation completes until the wait is unregistered. 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

這個(gè)方法意思是說(shuō),當(dāng)waitObject發(fā)出信號(hào)時(shí),就調(diào)用callBack這個(gè)方法。相當(dāng)于為waitObject注冊(cè)了一個(gè)回調(diào)方法(callBack),或者說(shuō)是為回調(diào)方法設(shè)定了一個(gè)是否開(kāi)始的開(kāi)關(guān)(waitObject)。
網(wǎng)上有網(wǎng)友有例子,在寫(xiě)錄音程序時(shí),需要收到錄音程序的通知事件,而去做相關(guān)事情,因此使用了本方法,具體的地址如下:網(wǎng)友使用本方法的例子
另外,有網(wǎng)友對(duì)本方法進(jìn)行了詳細(xì)的說(shuō)明,并且寫(xiě)的很不錯(cuò),具體的網(wǎng)址在這兒
對(duì)于方法的用途,看了上面的說(shuō)明,應(yīng)該沒(méi)有問(wèn)題,但是我很好奇WaitHandle這個(gè)抽象類。因?yàn)樵凇禖LR via C#》的第28章也提到了這個(gè)抽象類,因此對(duì)WaitHandle整理了一下
WaitHandle抽象類
WaitHandle類的唯一作用就是包裝一個(gè)window內(nèi)核對(duì)象句柄。
WaitHandle類有一個(gè)屬性 SafeWaitHandle,其保存一個(gè)window內(nèi)核對(duì)象。WaitHandle類有如下的幾個(gè)方法

public virtual bool WaitOne()...
  • 1
  • 2

其方法的作用就是讓調(diào)用線程等待window底層內(nèi)核對(duì)象收到信號(hào),如果內(nèi)核對(duì)象收到信號(hào),則返回true,否則返回false。
所以RegisterWaitForSingleObject的含義應(yīng)該是這樣的:
執(zhí)行某個(gè)方法/動(dòng)作,使得內(nèi)核對(duì)象收到了信號(hào),則包含該內(nèi)核對(duì)象的WaitHandle的調(diào)用某方法時(shí),得到了true的反饋。當(dāng)收到這個(gè)反饋的時(shí)候,就是調(diào)用callBack方法。
另外,調(diào)用RegisterWaitForSingleObject,就應(yīng)該要調(diào)用Unregister方法,而不是要等待其自動(dòng)結(jié)束。
執(zhí)行上下文
在執(zhí)行線程中創(chuàng)建輔助線程時(shí),執(zhí)行線程的上下文內(nèi)容會(huì)復(fù)制到輔助線程中。這樣做是合理且正確的。但是存在一個(gè)問(wèn)題,就是會(huì)影響到性能。因此在system.threading中有一ExecutionContext 類,其作用就是決定是否將執(zhí)行線程的上下文復(fù)制到輔助線程上。
其主要的方法有:(注意是靜態(tài)方法)

[SecurityCriticalAttribute]public static AsyncFlowControl SuppressFlow()public static void RestoreFlow()public static bool IsFlowSuppressed()
  • 1
  • 2
  • 3
  • 4

可在程序中使用ExecutionContext.SuppressFlow(),抑制上下文的“流動(dòng)”。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
淺談線程池(下):相關(guān)試驗(yàn)及注意事項(xiàng) - 老趙點(diǎn)滴 - 追求編程之美 - 博客園
C#異步編程概述
C# 溫故而知新: 線程篇(四)
線程池之ThreadPool類與輔助線程
C#綜合揭秘——細(xì)說(shuō)多線程(上)
深入淺出Node.js(五):初探Node.js的異步I/O實(shí)現(xiàn)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服