にロックを同期するために、私はそれに2つのメソッドを持つクラスを持って、1スレッドの数を作成し、実行クラスを呼び出して、他はそれらのスレッド上げイベントを処理するイベントハンドラです完了してから(最初のメソッドを再度呼び出します)。どこで、どのようにこのコード
私がイベントを処理するメソッドは、イベントを発生させたスレッドで実行されることを理解しています。だから、のような、私はどのように多くのスレッドが実行されていると言うメンバ変数をSyncLockし、それから1を引く:
SyncLock Me //GetType(me)
_availableThreads -= 1
End SyncLock
だから私はいくつか質問があります。
主な質問:は私がSyncLockれるべき」をクラスでどこでも_availableThreadsをINGの - (スレッドが作成されたときに1を加算する)この質問に関連
サイドの質問スレッドを作成する方法、すなわち:
-
を
が、私は通常、現在のインスタンスをSyncLockと思いますが、私は代わりにタイプをSyncLocksコードを見てきましたので、
Me
(現在のインスタンス)をロック同期とGetType(me)
の違いは何ですか?は2間のパフォーマンスの違いがあるでしょうか?それ以外のものには影響を与えない、おそらくクラス内のものをロックする目的のために作成された別の「南京錠」オブジェクトのような、上記のためにロックできる小さなものがありますか?
注:_availableスレッドの唯一の目的は、任意の時点で実行すると、スレッドの実行に時間がかかることがジョブを処理することができますどのように多くのスレッドを制御することです。
コード:
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
非常に興味深い...私は連動クラスを認識していませんでした。ありがとう。 –
キューについての良い点 - 私は3.5を使用していますので、残念ながらそれは不可能です。スレッドに再結合して最初のメソッドを呼び出すことは可能ですか?あなたはこれを行う方法を知っていますか?おそらくthread.joinを使用していますか? –
@ Mr Shoubs:いいえ、実際はありません。 3.5を使用している場合は、キューへのすべてのアクセス(EnqueueとDequeueの両方)のために、プライベートオブジェクトのSyncLockを使用することをお勧めします。 –