2011-04-01 6 views
1

クラスAには、クラスC(doEvent())でトリガされるイベントのステータスを保持する変数Aが含まれています。スレッドはクラスBがEventArgデータをクラスCに送り返すイベントを開始するのを待ち、イベントハンドラUpdateClassVar(EventArgs e)を呼び出します。これはイベントハンドラが待機している時間です。C#.netイベントハンドラデリゲートの質問

質問:スレッドハンドラを使用して、Thread.Sleepに依存せずにステータス更新に依存するクラスCの次のステップ(//何か)をトリガするにはどうすればよいですか?

免責事項:初心者のプログラマーと考えてください。これは私の最高の試みと非常にエレガントでない解決策を考えてみましょう。自由に再設計して再コーディングしてください。これは、上記の問題を解決するためのプロトタイプ1つのみとみなすべきです。

注:実際に動作するはずの「現実世界」の例用に編集されたコード。 (完全にテストされていない)

その他の質問 - 以下の例のThread.Sleep(400)は、メインスレッドを停止します。代替プロセスを探していますが、すべてのプロセスを停止します。

public class OrderA : ICurrencyOrder 
{ 
    private int _clid; 

    private string _status; 

    public int Clid 
    { 
     get { return _clid; } 

     set { _clid = value; } 
    } 

    public string Status 
    { 
     get { return _status; } 

     set { _status = value; } 
    } 

} 


Class B 
{ 

     // event delegate for UpdateOrder 

     public event UpdateOrderDelegate UpdateOrderEvent; 

     /* Code Here to receive and process order assign status etc */ 

     /* An Event Arguments (args) Class is created that hold e.Status and e.Clid values */ 

     UpdateOrder(args) 

     private void UpdateOrder(args) 
     { 
      if (UpdateOrderEvent != null) 
      { 
       UpdateOrderEvent(this, e); 
      } 
     } 

} 


// This is the class that initates the order (sendOrder()) and then waits for the 
// status of the order before processing the next step in the order process 
// which could be to send order again to exit 

Class C 
{ 
     // add event handler to update status and clid from Class B 

     UpdateOrderEvent += new UpdateOrderDelegate(UpdateOrdersListener); 

     public void EnterOrder(EnterEventArgs e) 
     { 

     // set connectinon to ICurrencyOrder class above OrderA 
     // this uses a switch statement (omitted) to use correct class (A, B, C etc). 

     ICurrencyOrder ordVals = Class A; 

     bool fill = false; 

     for (int i=0; i<5 && fill=false; i++) 
     { 
      sendOrder("Symbol", price, clid, etc) 

      Thread.Sleep(400); 

      if (ordVals.Clid = clid) // check to see if order was updated using client id 
      { 
       if (ordVals.Status = 'FILLED') 
       { 
        filled = true; 
       } 

      } 

     } // end for loop 

     } // end EnterOrder 

     private void UpdateOrdersListener(object sender, EventArgs e) 
     { 
      OrderUpdateEventArgs ev = (OrderUpdatEventArgs)e; 

      // set connection to appropriate class using switch (symbol) omitted 

      ICurrencyOrder ordVal = Class A; 

      ordVal.Status = e.Status; 

      ordVal.Clid = e.Clid; 

     } // end Class C 

答えて

0

私はあなたが何かをやって続行する前に起こるために何かを待つようにしたい場合はAutoResetEventは、あなたが探しているクラスだと思います。

クラスの説明ページには例がありますが、基本的には待ちたいところにWaitOne、続行するにはSetを呼び出します。