2011-07-07 13 views
5

私は関数を持っています。それはFunc1とit contains Func2 &というイベントハンドラと呼ばせてください。イベントが処理されるのを待つ

私が達成したいのは、not let関数(Func1)がFunc2がイベントを発生させて処理するまでの戻り値です。

基本的に、Func1には文字列の戻り値があり、文字列値はイベントハンドラ内に設定されています。イベントを処理してから値を返すまで待つ必要があります。

コード例は

public static string Fun1() 
    { 
     string stringToReturn = String.Empty; 
     Func2(); //Func2 will after few sec fire event bellow 

     example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) => 
           { 
            stringToReturn = "example"; //this wont be hardcoded 
           }; 

     //wait for event to be handled and then return value 
     return stringToReturn; 
    } 
+0

Func2はFunc1以外のスレッドで実行されますか? –

+0

それは同じスレッドで実行されません – Toni

答えて

8

あなたはAutoResetEventクラスを使用することができます。 var evt = new AutoResetEvent(false);でインスタンシエートし、待ちたい場所のevt.WaitOne()に電話をかけ、待っているコードが続行されることを知らせるevt.Set();を送信します。

イベントを含む「待機する」状況が多い場合は、Reactive Extensions (Rx)を参照することもできます。

+0

正直言って私はそれを正常に実装するために管理しませんでした。それをコードに追加した後、Finc1は値を返す行に決して行きません – Toni

+0

@Toni:どこに 'evt.WaitOne()'と 'evt.Set()'を呼び出しましたか? 'AutoResetEvent'の同じインスタンスで両方のメソッドを呼び出すことは確実ですか(これは重要です)? –

+0

私は(少なくとも私はそうだと思っています)私は別のプロジェクトでMSNDの例を試し、何が起こっているのかを調べます – Toni

1

単純なセマフォでは十分でしょうか? Func1と同じスレッド上で

public static string Fun1() 
{ 
    Semaphore sem = new Semaphore(1,1); 

    string stringToReturn = String.Empty; 
    Func2(); //Func2 will after few sec fire event bellow 

    example.MyEvent += (object sender, WebBrowserDocumentCompletedEventArgs e) => 
          { 
           stringToReturn = "example"; //this wont be hardcoded 
           sem.Release(); 
          }; 
    sem.WaitOne(); 

    //wait for event to be handled and then return value 
    return stringToReturn; 
} 
0

Func2として実行され、Func1Func2戻る前に戻りません。つまり、Func1に制御を戻す前に、Func2で発生したイベントが発生していることが保証されています。 Func2を呼び出す前にイベントハンドラを添付すれば、期待通りに動作するはずです。

このシナリオでは、SemaphoreまたはAutoResetEventを使用することは、両方ともスレッド同期を管理するためのOSリソースを取得するため、過剰です。

関連する問題