2 つのメソッドを持つクラスがあります。1 つは多数のスレッドを作成して実行するクラスを呼び出し、もう 1 つはそれらのスレッドが完了したときに発生するイベントを処理する (そして最初のメソッドを再度呼び出す) イベント ハンドラーです。
イベントを処理するメソッドは、イベントを発生させたスレッドで実行されることを理解しています。そのため、SyncLock実行中のスレッド数を示すメンバー変数を作成し、そこから 1 を引きます。
SyncLock Me ' GetType(me)
_availableThreads -= 1
End SyncLock
だから私はいくつかの質問があります:
主な質問:クラスのどこでもSyncLockする必要がありますか?_availableThreadsつまり、スレッドを作成するメソッド (スレッドが作成されると 1 が追加されます) で
この質問に関連する副次的な質問:
通常
SyncLockは現在のインスタンスを使用しますが、代わりにタイプのコードを見たことがあるので、同期ロック(現在のインスタンス) とSyncLockの違いは何ですか?MeGetType(Me)2つの間にパフォーマンスの違いはありますか?そして、他に影響を与えない上記のためにロックできる小さなものはありますか?おそらく、クラス内のものをロックするという唯一の目的のために作成された別の「南京錠」オブジェクトですか?
注: の唯一の目的は_availableThreads、特定の時間に実行できるスレッド数を制御し、スレッドが実行に数時間かかるジョブを処理することです。
コード:
Public Class QManager
Private _maxThreadCount, _availableThreads As Integer
Public Sub New(ByVal maxThreadCount As Integer)
Me.MaximumThreadCount = maxThreadCount
End Sub
Public Sub WorkThroughQueue()
//get jobs from queue (priorities change, so call this every time)
Dim jobQ As Queue(Of QdJobInfo) = QueueDAO.GetJobList
//loop job queue while there are jobs and we have threads available
While jobQ.Count > 0 And _availableThreads <= _maxThreadCount
//create threads for each queued job
Dim queuedJob As New QdJob(jobQ.Dequeue)
AddHandler queuedJob.ThreadComplete, AddressOf QueuedJob_ThreadCompleted
_availableThreads += 1 //use a thread up (do we need a sync lock here?)***************************
queuedJob.Process() //go process the job
End While
//when we get here, don't do anything else - when a job completes it will call this method again
End Sub
Private Sub QueuedJob_ThreadCompleted(ByVal sender As QdJobInfo, ByVal args As EventArgs)
SyncLock Me //GetType(me)
_availableThreads -= 1
End SyncLock
//regardless of how the job ended, we want to carry on going through the rest of the jobs
WorkThroughQueue()
End Sub
#Region "Properties"
Public Property MaximumThreadCount() As Integer
Get
Return _maxThreadCount
End Get
Set(ByVal value As Integer)
If value > Environment.ProcessorCount * 2 Then
_maxThreadCount = value
Else
value = Environment.ProcessorCount
End If
LogFacade.LogInfo(_logger, "Maximum Thread Count set to " & _maxThreadCount)
End Set
End Property
#End Region
End Class