tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 も
付与しておくことをお奨めします。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。