2016-09-19 10 views
2

私はいくつかのスレッドとデリゲートで動作するメソッドを持っています。マルチスレッドとデリゲートの呼び出し

public delegate void Del(string threadId, string value, ref string result); 

public event Del Analyze= null; // The external world can plug in a method 


// this method runs simultanioulsy in several threads 
private void threaded() 
{ 
    string s= null; 
    // yadayada s gets a value and I want a result back 
    // from the external world 
    string result = null; 

    is (Analyze != null) 
     Analyze("some thread id", s, ref result); 
} 

私はイベントとして使用する方法が

Analyze("some thread id", s, ref result); 

が同時に呼び出された場合、安全、などが、何が起こるのスレッドにするために同期させる必要があることを承知していますか?それは大丈夫ですか?それとも、私は次のように分析して同期する必要があります:

lock(someobj) 
{ 
    Analyze("some thread id", s, ref result); 
} 

そこで問題は、より多くのようなものです。このスレッドのような「イベント」は、呼び出し元のクラスの観点から安全である(私は、スレッドの安全性を保証する必要があります知っていますプラグインされたメソッド)

+0

はい、複数のスレッドで共有されているリソースを操作する場合は、常に同期する必要があります。 –

+0

@ rory.ap確かに、これは 'Analyze(...)'が状態を変更するかどうかによって異なります。 –

+0

@ScottPerham私はそれが欲しいと思います。そうでなければ、パラメータ 'ref'を作ることに意味がありません。 – itsme86

答えて

2

イベントを発生させるクラスは、それが複数のスレッドで同時に行うことができます。 「イベント」は、順番に呼び出されるメソッドのリストのようなものです。

あなたは、それはそのイベントを設計する方法であれば、別のイベントによって、複数のスレッドで呼び出される可能性に対処するためのイベントハンドラの義務であると言うように、それぞれ別のスレッドには、別のイベントを上げるとされます。

イベントを発生させるクラスの観点からのスレッドの安全性は、用語を混合しているためにあなたが求めているものの説明ではありません。スレッドの安全性とは、クラスがマルチスレッド環境で安全に作業するために呼び出されるかどうか、クラスの状態を介してそれらのスレッドが相互作用しないかどうかということです。

関連する問題