vb.net2019-多线程并行计算(5)
一、線(xiàn)程狀態(tài)涉及的CLR類(lèi)
1)Process 類(lèi)
提供對(duì)本地和遠(yuǎn)程進(jìn)程的訪(fǎng)問(wèn)并使您能夠啟動(dòng)和停止本地系統(tǒng)進(jìn)程
GetCurrentProcess 獲取新的 Process 組件并將其與當(dāng)前活動(dòng)的進(jìn)程關(guān)聯(lián)。
2)ProcessThread 類(lèi)
使用 ProcessThread 來(lái)獲取系統(tǒng)上當(dāng)前運(yùn)行的線(xiàn)程的信息。 例如,這樣做將使您能夠監(jiān)視線(xiàn)程的性能特性。
線(xiàn)程是沿程序執(zhí)行的路徑。 它是 Win32 安排的最小執(zhí)行單位。 它由堆棧、CPU 注冊(cè)的狀態(tài)和系統(tǒng)計(jì)劃程序的執(zhí)行列表中的項(xiàng)組成。
進(jìn)程包括一個(gè)或多個(gè)線(xiàn)程和代碼、數(shù)據(jù)和內(nèi)存中的其他程序資源。 典型的程序資源是打開(kāi)的文件、信號(hào)燈和動(dòng)態(tài)分配的內(nèi)存。 進(jìn)程的所有線(xiàn)程共享該進(jìn)程的每一資源。
當(dāng)系統(tǒng)計(jì)劃程序給程序的線(xiàn)程之一執(zhí)行控制權(quán)時(shí),程序便執(zhí)行。 計(jì)劃程序確定哪些線(xiàn)程運(yùn)行以及何時(shí)運(yùn)行。 在較高優(yōu)先級(jí)的線(xiàn)程完成任務(wù)的時(shí)候,較低優(yōu)先級(jí)的線(xiàn)程可能會(huì)被迫等待。 在多處理器計(jì)算機(jī)上,計(jì)劃程序可將單個(gè)線(xiàn)程移到不同的處理器上,從而對(duì) CPU 負(fù)荷進(jìn)行平衡。
每個(gè)進(jìn)程啟動(dòng)時(shí)都具有一個(gè)線(xiàn)程,該線(xiàn)程稱(chēng)為主線(xiàn)程。 任何線(xiàn)程都可以創(chuàng)建附加線(xiàn)程。 進(jìn)程中的所有線(xiàn)程共享該進(jìn)程的地址空間。
常用方法如下:
BasePriority 獲取線(xiàn)程的基本優(yōu)先級(jí)。
CanRaiseEvents 獲取一個(gè)指示組件是否可以引發(fā)事件的值。 (繼承自 Component。)
Container 獲取 IContainer,它包含 Component。 (繼承自 Component。)
CurrentPriority 獲取線(xiàn)程的當(dāng)前優(yōu)先級(jí)。
DesignMode 獲取一個(gè)值,用以指示 Component 當(dāng)前是否處于設(shè)計(jì)模式。 (繼承自 Component。)
Events 獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。)
Id 獲取線(xiàn)程的唯一標(biāo)識(shí)符。
IdealProcessor 設(shè)置讓此線(xiàn)程在其上運(yùn)行的首選處理器。
PriorityBoostEnabled 獲取或設(shè)置一個(gè)值,該值指示每當(dāng)關(guān)聯(lián)線(xiàn)程的進(jìn)程主窗口接收焦點(diǎn)時(shí),操作系統(tǒng)是否暫時(shí)提升該線(xiàn)程的優(yōu)先級(jí)。
PriorityLevel 獲取或設(shè)置線(xiàn)程的優(yōu)先級(jí)別。
PrivilegedProcessorTime 獲取線(xiàn)程在操作系統(tǒng)內(nèi)核中運(yùn)行代碼所用的時(shí)間。
ProcessorAffinity 設(shè)置關(guān)聯(lián)線(xiàn)程可以在其上運(yùn)行的處理器。
Site 獲取或設(shè)置 Component 的 ISite。 (繼承自 Component。)
StartAddress 獲取操作系統(tǒng)調(diào)用的、啟動(dòng)此線(xiàn)程的函數(shù)的內(nèi)存地址。
StartTime 獲取操作系統(tǒng)啟動(dòng)該線(xiàn)程的時(shí)間。
ThreadState 獲取此線(xiàn)程的當(dāng)前狀態(tài)。
TotalProcessorTime 獲取此線(xiàn)程使用處理器的時(shí)間總量。
UserProcessorTime 獲取關(guān)聯(lián)的線(xiàn)程在應(yīng)用程序內(nèi)運(yùn)行代碼所用的時(shí)間。
WaitReason 獲取線(xiàn)程等待的原因。
屬性為:
BasePriority 獲取線(xiàn)程的基本優(yōu)先級(jí)。
CanRaiseEvents 獲取一個(gè)指示組件是否可以引發(fā)事件的值。 (繼承自 Component。)
Container 獲取 IContainer,它包含 Component。 (繼承自 Component。)
CurrentPriority 獲取線(xiàn)程的當(dāng)前優(yōu)先級(jí)。
DesignMode 獲取一個(gè)值,用以指示 Component 當(dāng)前是否處于設(shè)計(jì)模式。 (繼承自 Component。)
Events 獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。)
Id 獲取線(xiàn)程的唯一標(biāo)識(shí)符。
IdealProcessor 設(shè)置讓此線(xiàn)程在其上運(yùn)行的首選處理器。
PriorityBoostEnabled 獲取或設(shè)置一個(gè)值,該值指示每當(dāng)關(guān)聯(lián)線(xiàn)程的進(jìn)程主窗口接收焦點(diǎn)時(shí),操作系統(tǒng)是否暫時(shí)提升該線(xiàn)程的優(yōu)先級(jí)。
PriorityLevel 獲取或設(shè)置線(xiàn)程的優(yōu)先級(jí)別。
PrivilegedProcessorTime 獲取線(xiàn)程在操作系統(tǒng)內(nèi)核中運(yùn)行代碼所用的時(shí)間。
ProcessorAffinity 設(shè)置關(guān)聯(lián)線(xiàn)程可以在其上運(yùn)行的處理器。
Site 獲取或設(shè)置 Component 的 ISite。 (繼承自 Component。)
StartAddress 獲取操作系統(tǒng)調(diào)用的、啟動(dòng)此線(xiàn)程的函數(shù)的內(nèi)存地址。
StartTime 獲取操作系統(tǒng)啟動(dòng)該線(xiàn)程的時(shí)間。
ThreadState 獲取此線(xiàn)程的當(dāng)前狀態(tài)。
TotalProcessorTime 獲取此線(xiàn)程使用處理器的時(shí)間總量。
UserProcessorTime 獲取關(guān)聯(lián)的線(xiàn)程在應(yīng)用程序內(nèi)運(yùn)行代碼所用的時(shí)間。
WaitReason 獲取線(xiàn)程等待的原因。
4、運(yùn)行效果
[點(diǎn)擊并拖拽以移動(dòng)]
對(duì)于等待原因來(lái)說(shuō),有以下幾種:
我們需要使用ThreadWaitReason 枚舉:
ThreadWaitReason 枚舉
Executive 線(xiàn)程正在等待計(jì)劃程序。
FreePage 線(xiàn)程正在等待可用的虛擬內(nèi)存頁(yè)。
PageIn 線(xiàn)程正在等待虛擬內(nèi)存頁(yè)到達(dá)內(nèi)存。
SystemAllocation 線(xiàn)程正在等待系統(tǒng)分配。
ExecutionDelay 線(xiàn)程執(zhí)行延遲。
Suspended 線(xiàn)程執(zhí)行暫停。
UserRequest 線(xiàn)程正在等待用戶(hù)請(qǐng)求。
EventPairHigh 線(xiàn)程正在等待事件對(duì)高。
EventPairLow 線(xiàn)程正在等待事件對(duì)低。
LpcReceive 線(xiàn)程正在等待本地過(guò)程調(diào)用到達(dá)。
LpcReply 線(xiàn)程正在等待對(duì)本地過(guò)程調(diào)用的回復(fù)到達(dá)。
VirtualMemory 線(xiàn)程正在等待系統(tǒng)分配虛擬內(nèi)存。
PageOut 線(xiàn)程正在等待虛擬內(nèi)存頁(yè)寫(xiě)入磁盤(pán)。
Unknown 線(xiàn)程正在因未知原因而等待。
我們?cè)谏厦娲a中加入了線(xiàn)程狀態(tài)的輸出
Console.WriteLine(pt.Id & “=>線(xiàn)程狀態(tài):” & pt.ThreadState.ToString)
在上一節(jié)和本節(jié)的上面代碼中,與線(xiàn)程狀態(tài)與調(diào)度有關(guān)的核心代碼如下 :
其中
1)得到當(dāng)前進(jìn)程的所有線(xiàn)程集合:
value = Process.GetCurrentProcess().Threads2)在線(xiàn)程集合中迭代
For Each pt In value .......next3)判斷該線(xiàn)程的狀態(tài)是不是等待
If pt.ThreadState = Wait Then
4)等待原因
注意pt.WaitReason和pt.ThreadState 都是枚舉值,因此在前面
Imports System.Diagnostics.ThreadState5)如果線(xiàn)程沒(méi)有處于等待狀態(tài),則輸出線(xiàn)程的當(dāng)前狀態(tài)
Console.WriteLine(pt.Id & "=>線(xiàn)程狀態(tài):" & pt.ThreadState.ToString)6)pt.Id為獲取線(xiàn)程的唯一標(biāo)識(shí)符,ManagedThreadId 屬性的值是一個(gè)整數(shù),表示此托管線(xiàn)程的唯一標(biāo)識(shí)符,不會(huì)隨時(shí)間而變化,即使承載公共語(yǔ)言運(yùn)行時(shí)的非托管代碼將線(xiàn)程實(shí)現(xiàn)為纖程。
2、線(xiàn)程的名字可以使用Thread.Name ,它 是包含線(xiàn)程名稱(chēng)的字符串類(lèi)型的 屬性
我們把上面的代碼改一下,加入thread.Name,不再像以前那樣通過(guò) mythread1.Start(“線(xiàn)程1”)
傳入一個(gè)字符串參數(shù)進(jìn)入線(xiàn)程,讓線(xiàn)程內(nèi)部知道它的名字
注意以上代碼的下面幾個(gè)部分
1)Public Sub mythreadrun(ByVal myprocess As Object)2) Dim myprocess As Process = Process.GetCurrentProcess()Console.WriteLine("進(jìn)程名稱(chēng):" & myprocess.ProcessName)'執(zhí)行線(xiàn)程mythread1.Start(myprocess)mythread2.Start(myprocess)mythread3.Start(myprocess)正在上傳…
取消
總結(jié)
以上是生活随笔為你收集整理的vb.net2019-多线程并行计算(5)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java获取json中某个字段
- 下一篇: WebSocket协议入门介绍