2017-07-25 6 views
1

これはVB.NETのDoSomethingメソッドへのスレッドセーフティを確実にするのに適していますか?スレッドセーフなメソッドを書くには?

Public Class MyForm : Inherits Form 

    Public Sub DoSomething(parameter As Object) 
     If Me.InvokeRequired Then 
      Me.Invoke(Sub() DoSomething(parameter)) 
     Else 
      'Do Something 
     End If 
    End Sub 

End Class 

答えて

3

私はあなたが用語の通常の定義よりスレッドの安全性によって異なる何かを意味するかもしれないと考えています。この用語の通常の意味は、エラーまたは負の副作用なしに同じメソッドまたはオブジェクトを複数のスレッドが同時に呼び出すことができるということです。通常、そのようなスレッドセーフティは、ステートレス性とロック機能(例えば、SyncLock)によって実現されます。

しかし、あなたの例では、コードはそのようなスレッドセーフティを提供しようとしているわけではなく、少なくとも直接的ではありません。この種のスレッドセーフティを実現しますが、すべての呼び出しを同じ単一のスレッド(UIスレッド)上で実行するだけです。 WinFormアプリケーション(これは私が推測している)は、すべてのUI作業がUIスレッドで行われることが必要です。したがって、UIで何かを行うメソッドが別のスレッドから呼び出された場合は、まず、その作業を完了する前にUIスレッドに呼び出す必要があります。その特定のシナリオでは、投稿したコードは問題ありません。

+0

ありがとうございました。私は時々SyncLockを使いましたが、あなたが何を意味しているのか理解していますが、知識の不足、何が無国籍なのか分かりません。私が行ってそれについて学ぶためのヒントを教えてください。 – VBobCat

+1

これは、メソッドやオブジェクトが内部状態を保持していない場合、一般にスレッドセーフであると考えられます。言い換えれば、メソッドがすべてのデータを入力パラメータとして要求し、すべての結果を戻り値として返し、そのフィールドのいずれかにデータを読み書きしない限り、多くのスレッドから同時に呼び出されるのが安全です。オブジェクトが呼び出し間で値を保持している場合、特にそのメソッドやプロパティを呼び出すと状態が変化する場合は、その状態が不安定になるため安全ではありません。 –

+1

もっと一般的なので、おそらく私が使用した方が良いことは_Immutability_だったと思います。 –

関連する問題