2016-04-13 10 views
4

C#プロジェクトでデータを取得するときにイベントを待つ必要があります。アプリケーションで待機イベント

プログラムがいくつかのデータを読み出す場合のGetDataその他のプログラム(EventForGetDataを呼び出す)、このデータを読み取るの最後にイベントを作成します。 したがって、私は読み込みを終了するEventForGetDataを待つ必要があります。

私はこの作業のためにこのコードを書いていますが、このコードがより最適なものになると考えています。

 public static bool WaitEvent = true; 
     public void EventForGetData(string variable) 
     { 
      WaitEvent = false; 
     } 

     public static string ForWaitGetData() 
     { 
      WaitEvent = true; 
      while (WaitEvent) 
      { 
       System.Threading.Thread.Sleep(5); 
       Application.DoEvents();     
      } 
      return Variable; 
     } 

     public object GetData(){ 
      // start read data 
       ... 
      // Wait for finish to read data 
      ForWaitGetData(); 

     // finish read data 
       ... 
      return MyObject; 
     } 

答えて

1

あなたの処理を行うか、あなたのイベントを起動終了時に、最初のタスクは、あなたのデータを取得することですタスクを使用してみてください: 例に

Task task = Task.Factory.StartNew(() => 
      { 
       //put you code here the first one 
      }).ContinueWith((rs) =>{ 
       //Launch your event or anything you want 
      }); 

:あなたのコードをContinueWithはStartNewで記述したコードの後に​​実行されます。 // を置く。

+0

申し訳ありませんが、私は私の例...タスクのタスク= Task.Factory.StartNew(()=> { webBrowser.Document.InvokeScript( "")のためにそれを書くのか分かりませんここに最初のコードを記述する })ContinueWith((rs)=> { ScriptInterface.ForWaitGetData(); //イベントや何かを起動する }); – askeet

+1

あなたのコードを完全に理解しているのであれば、なぜ変数を返さないと意味がないので、Variableを使用しない限り、このようなコードを整理しなかったのはなぜですか? –

+0

主な問題は、GetData()とEventForGetData()です。これは、同じスレッドです。 1つのCOMオブジェクトは、GetData()を使用するとEventForGetData()を生成するためです。したがって、GetDataがEventを待つとき、COMがGetData()で待機しているときにApplication.DoEvent()を使用しないと、COMは関数EventForGetData()を呼び出すことはありません。 – askeet