日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vb.net2019-多线程并行计算(5)

發布時間:2025/3/12 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vb.net2019-多线程并行计算(5) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、線程狀態涉及的CLR類
1)Process 類

提供對本地和遠程進程的訪問并使您能夠啟動和停止本地系統進程

GetCurrentProcess 獲取新的 Process 組件并將其與當前活動的進程關聯。

2)ProcessThread 類

使用 ProcessThread 來獲取系統上當前運行的線程的信息。 例如,這樣做將使您能夠監視線程的性能特性。

線程是沿程序執行的路徑。 它是 Win32 安排的最小執行單位。 它由堆棧、CPU 注冊的狀態和系統計劃程序的執行列表中的項組成。

進程包括一個或多個線程和代碼、數據和內存中的其他程序資源。 典型的程序資源是打開的文件、信號燈和動態分配的內存。 進程的所有線程共享該進程的每一資源。

當系統計劃程序給程序的線程之一執行控制權時,程序便執行。 計劃程序確定哪些線程運行以及何時運行。 在較高優先級的線程完成任務的時候,較低優先級的線程可能會被迫等待。 在多處理器計算機上,計劃程序可將單個線程移到不同的處理器上,從而對 CPU 負荷進行平衡。

每個進程啟動時都具有一個線程,該線程稱為主線程。 任何線程都可以創建附加線程。 進程中的所有線程共享該進程的地址空間。

常用方法如下:

BasePriority 獲取線程的基本優先級。
CanRaiseEvents 獲取一個指示組件是否可以引發事件的值。 (繼承自 Component。)
Container 獲取 IContainer,它包含 Component。 (繼承自 Component。)
CurrentPriority 獲取線程的當前優先級。
DesignMode 獲取一個值,用以指示 Component 當前是否處于設計模式。 (繼承自 Component。)
Events 獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。)
Id 獲取線程的唯一標識符。
IdealProcessor 設置讓此線程在其上運行的首選處理器。
PriorityBoostEnabled 獲取或設置一個值,該值指示每當關聯線程的進程主窗口接收焦點時,操作系統是否暫時提升該線程的優先級。
PriorityLevel 獲取或設置線程的優先級別。
PrivilegedProcessorTime 獲取線程在操作系統內核中運行代碼所用的時間。
ProcessorAffinity 設置關聯線程可以在其上運行的處理器。
Site 獲取或設置 Component 的 ISite。 (繼承自 Component。)
StartAddress 獲取操作系統調用的、啟動此線程的函數的內存地址。
StartTime 獲取操作系統啟動該線程的時間。
ThreadState 獲取此線程的當前狀態。
TotalProcessorTime 獲取此線程使用處理器的時間總量。
UserProcessorTime 獲取關聯的線程在應用程序內運行代碼所用的時間。
WaitReason 獲取線程等待的原因。

屬性為:

BasePriority 獲取線程的基本優先級。
CanRaiseEvents 獲取一個指示組件是否可以引發事件的值。 (繼承自 Component。)
Container 獲取 IContainer,它包含 Component。 (繼承自 Component。)
CurrentPriority 獲取線程的當前優先級。
DesignMode 獲取一個值,用以指示 Component 當前是否處于設計模式。 (繼承自 Component。)
Events 獲取附加到此 Component 的事件處理程序的列表。 (繼承自 Component。)
Id 獲取線程的唯一標識符。
IdealProcessor 設置讓此線程在其上運行的首選處理器。
PriorityBoostEnabled 獲取或設置一個值,該值指示每當關聯線程的進程主窗口接收焦點時,操作系統是否暫時提升該線程的優先級。
PriorityLevel 獲取或設置線程的優先級別。
PrivilegedProcessorTime 獲取線程在操作系統內核中運行代碼所用的時間。
ProcessorAffinity 設置關聯線程可以在其上運行的處理器。
Site 獲取或設置 Component 的 ISite。 (繼承自 Component。)
StartAddress 獲取操作系統調用的、啟動此線程的函數的內存地址。
StartTime 獲取操作系統啟動該線程的時間。
ThreadState 獲取此線程的當前狀態。
TotalProcessorTime 獲取此線程使用處理器的時間總量。
UserProcessorTime 獲取關聯的線程在應用程序內運行代碼所用的時間。
WaitReason 獲取線程等待的原因。

Imports System Imports System.Threading Imports System.Diagnostics Imports System.Diagnostics.ThreadStateModule Module1Sub Main()Dim mythread1 As ThreadDim mythread2 As ThreadDim mythread3 As Thread'創建線程對象mythread1 = New Thread(AddressOf mythreadrun)mythread2 = New Thread(AddressOf mythreadrun)mythread3 = New Thread(AddressOf mythreadrun)Console.WriteLine(Now.ToLongTimeString & "線程對象創建完畢,開始執行線程")'執行線程mythread1.Start("線程1")mythread2.Start("線程2")mythread3.Start("線程3")'等待線程完成mythread1.Join()mythread2.Join()mythread3.Join()'線程執行完畢Console.WriteLine(Now.ToLongTimeString & "線程執行完畢!")End SubPublic Sub mythreadrun(ByVal data As Object)Dim mynum As Integer'GetCurrentProcess 獲取新的 Process 組件并將其與當前活動的進程關聯。 '分配一個新的槽,這個槽存放線程本地數據,槽名稱為'myjg,名稱必須唯一Dim jg As LocalDataStoreSlotjg = Thread.GetNamedDataSlot("myjg")Thread.SetData(jg, 30)TryFor mynum = 1 To 10Thread.SetData(jg, Thread.GetData(jg) - mynum)Console.WriteLine(Thread.CurrentThread.ManagedThreadId & "==>" & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",計算結果為:" & Thread.GetData(jg))'獲取線程狀態Thread.Sleep(5)Dim value As ProcessThreadCollectionDim pt As ProcessThreadvalue = Process.GetCurrentProcess().ThreadsFor Each pt In valueIf pt.ThreadState = Wait ThenConsole.WriteLine(pt.Id & "等待原因:" & pt.WaitReason.ToString)End IfNextNextCatchConsole.WriteLine(data & " " & Now.ToLongTimeString & "線程異常終止!")'終止線程Thread.CurrentThread.Abort()FinallyThread.FreeNamedDataSlot("myjg")End TryEnd Sub End Module

4、運行效果

[點擊并拖拽以移動]

對于等待原因來說,有以下幾種:

我們需要使用ThreadWaitReason 枚舉:
ThreadWaitReason 枚舉

Executive 線程正在等待計劃程序。
FreePage 線程正在等待可用的虛擬內存頁。
PageIn 線程正在等待虛擬內存頁到達內存。
SystemAllocation 線程正在等待系統分配。
ExecutionDelay 線程執行延遲。
Suspended 線程執行暫停。
UserRequest 線程正在等待用戶請求。
EventPairHigh 線程正在等待事件對高。
EventPairLow 線程正在等待事件對低。
LpcReceive 線程正在等待本地過程調用到達。
LpcReply 線程正在等待對本地過程調用的回復到達。
VirtualMemory 線程正在等待系統分配虛擬內存。
PageOut 線程正在等待虛擬內存頁寫入磁盤。
Unknown 線程正在因未知原因而等待。

Imports System Imports System.Threading Imports System.Diagnostics Imports System.Diagnostics.ThreadStateModule Module1Sub Main()Dim mythread1 As ThreadDim mythread2 As ThreadDim mythread3 As Thread'創建線程對象mythread1 = New Thread(AddressOf mythreadrun)mythread2 = New Thread(AddressOf mythreadrun)mythread3 = New Thread(AddressOf mythreadrun)Console.WriteLine(Now.ToLongTimeString & "線程對象創建完畢,開始執行線程")'執行線程mythread1.Start("線程1")mythread2.Start("線程2")mythread3.Start("線程3")'等待線程完成mythread1.Join()mythread2.Join()mythread3.Join()'線程執行完畢Console.WriteLine(Now.ToLongTimeString & "線程執行完畢!")End SubPublic Sub mythreadrun(ByVal data As Object)Dim mynum As Integer'分配一個新的槽,這個槽存放線程本地數據,槽名稱為'myjg,名稱必須唯一Dim jg As LocalDataStoreSlotjg = Thread.GetNamedDataSlot("myjg")Thread.SetData(jg, 30)TryFor mynum = 1 To 10Thread.SetData(jg, Thread.GetData(jg) - mynum)Console.WriteLine(Thread.CurrentThread.ManagedThreadId & "==>" & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",計算結果為:" & Thread.GetData(jg))'獲取線程狀態Thread.Sleep(5)Dim value As ProcessThreadCollectionDim pt As ProcessThreadvalue = Process.GetCurrentProcess().ThreadsFor Each pt In valueIf pt.ThreadState = Wait ThenConsole.WriteLine(pt.Id & "=>等待原因:" & pt.WaitReason.ToString)ElseConsole.WriteLine(pt.Id & "=>線程狀態:" & pt.ThreadState.ToString)End IfNextNextCatchConsole.WriteLine(data & " " & Now.ToLongTimeString & "線程異常終止!")'終止線程Thread.CurrentThread.Abort()FinallyThread.FreeNamedDataSlot("myjg")End TryEnd Sub End Module

我們在上面代碼中加入了線程狀態的輸出

Console.WriteLine(pt.Id & “=>線程狀態:” & pt.ThreadState.ToString)
在上一節和本節的上面代碼中,與線程狀態與調度有關的核心代碼如下 :

Dim value As ProcessThreadCollection Dim pt As ProcessThread value = Process.GetCurrentProcess().Threads For Each pt In valueIf pt.ThreadState = Wait ThenConsole.WriteLine(pt.Id & "=>等待原因:" & pt.WaitReason.ToString)ElseConsole.WriteLine(pt.Id & "=>線程狀態:" & pt.ThreadState.ToString)End If Next

其中

1)得到當前進程的所有線程集合:

value = Process.GetCurrentProcess().Threads

2)在線程集合中迭代

For Each pt In value .......next

3)判斷該線程的狀態是不是等待

If pt.ThreadState = Wait Then
4)等待原因

Console.WriteLine(pt.Id & "=>等待原因:" & pt.WaitReason.ToString)

注意pt.WaitReason和pt.ThreadState 都是枚舉值,因此在前面

Imports System.Diagnostics.ThreadState

5)如果線程沒有處于等待狀態,則輸出線程的當前狀態

Console.WriteLine(pt.Id & "=>線程狀態:" & pt.ThreadState.ToString)

6)pt.Id為獲取線程的唯一標識符,ManagedThreadId 屬性的值是一個整數,表示此托管線程的唯一標識符,不會隨時間而變化,即使承載公共語言運行時的非托管代碼將線程實現為纖程。

2、線程的名字可以使用Thread.Name ,它 是包含線程名稱的字符串類型的 屬性

我們把上面的代碼改一下,加入thread.Name,不再像以前那樣通過 mythread1.Start(“線程1”)
傳入一個字符串參數進入線程,讓線程內部知道它的名字

Imports System Imports System.Threading Imports System.Diagnostics Imports System.Diagnostics.ThreadStateModule Module1Sub Main()Dim mythread1 As ThreadDim mythread2 As ThreadDim mythread3 As Thread'創建線程對象mythread1 = New Thread(AddressOf mythreadrun)mythread2 = New Thread(AddressOf mythreadrun)mythread3 = New Thread(AddressOf mythreadrun)mythread1.Name = "thread_1"mythread2.Name = "thread_2"mythread3.Name = "thread_3"Console.WriteLine(Now.ToLongTimeString & "線程對象創建完畢,開始執行線程")'執行線程mythread1.Start()mythread2.Start()mythread3.Start()'等待線程完成mythread1.Join()mythread2.Join()mythread3.Join()'線程執行完畢Console.WriteLine(Now.ToLongTimeString & "線程執行完畢!")End SubPublic Sub mythreadrun()Dim mynum As Integer'分配一個新的槽,這個槽存放線程本地數據,槽名稱為'myjg,名稱必須唯一Dim jg As LocalDataStoreSlotjg = Thread.GetNamedDataSlot("myjg")Thread.SetData(jg, 30)TryFor mynum = 1 To 10Thread.SetData(jg, Thread.GetData(jg) - mynum)Console.WriteLine(Thread.CurrentThread.Name & "==>" & Now.ToLongTimeString & "=>" & (Thread.GetData(jg) + mynum) & "-" & mynum & ",計算結果為:" & Thread.GetData(jg))Thread.Sleep(5)NextCatchConsole.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "線程異常終止!")'終止線程Thread.CurrentThread.Abort()FinallyThread.FreeNamedDataSlot("myjg")Console.WriteLine(Thread.CurrentThread.Name & " " & Now.ToLongTimeString & "線程運行完畢!")End TryEnd Sub End Module

注意以上代碼的下面幾個部分

1Public Sub mythreadrun(ByVal myprocess As Object)2) Dim myprocess As Process = Process.GetCurrentProcess()Console.WriteLine("進程名稱:" & myprocess.ProcessName)'執行線程mythread1.Start(myprocess)mythread2.Start(myprocess)mythread3.Start(myprocess)

正在上傳…
取消

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的vb.net2019-多线程并行计算(5)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。