タイトル : Re^2: CA2213の対処方法 投稿日 : 2016/10/14(Fri) 15:52 投稿者 : 魔界の仮面弁士
一応補足。 > Public countZ As Integer この場合、Form1 以外からも countZ を読み書き出来ることになりますが、 マルチスレッド環境での同時更新はマズイです。 CheckTest 以外で使われる事がない変数なのであれば、 Public で公開する必要も無いので、Private な変数にしておきましょう。 あるいは Static なローカル変数にするという手もあります。 Form1 以外からの書き換えも必要なら、countZ フィールドを Public Property に書き換え、 同時アクセスに備えて、ReaderWriterLockSlim で保護するなどの対策が必要です。 Private lockSlim As New ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion) Private _countZ As Integer = 0 Public Property CountZ As Integer Get Dim c As Integer lockSlim.EnterReadLock() c = _countZ lockSlim.ExitReadLock() Return c End Get Set(value As Integer) lockSlim.EnterWriteLock() _countZ = value lockSlim.ExitWriteLock() End Set End Property もし、更新は CheckTest のみで行い、他からは参照のみで良いのであれば、 countZ フィールドを Public ReadOnly Property にしてしまい、 編集はバッキング フィールド越しに行うという手もあります。 Public ReadOnly Property CountZ As Integer Private Sub CheckTest() Console.WriteLine(Interlocked.Increment(_CountZ)) End Sub > licenseDelegate = New TimerCallback(AddressOf CheckTest) TimerCallback のデリゲートは、本来は Sub() ではなく、Sub(state As Object) です。 折角 Code Analyzer を有効にするのであれば、ついでも Option Strict On も 付与しておくことをお奨めします。 |