Вопрос делегата обработчика событий C # .net - PullRequest
1 голос
/ 02 апреля 2011

Класс A включает переменную A для хранения состояния события, которое инициируется в классе C (doEvent ()).Поток спит в течение 500 мс, ожидая, пока класс B запустит событие, которое отправит данные EventArg обратно в класс C, и вызовет обработчик события UpdateClassVar (EventArgs e) - чего он и ждет.Вопрос: Как использовать обработчик событий для запуска следующего шага в классе C (// сделать что-то), который зависит от обновления статуса, не полагаясь на Thread.Sleep ... ??

Отказ от ответственности: Считайте меняначинающий программист.Считай это моей лучшей попыткой и довольно не элегантным решением.Пожалуйста, не стесняйтесь перепроектировать и перекодировать, это следует рассматривать только как один опытный образец для решения вышеуказанной проблемы.

ПРИМЕЧАНИЕ. Код сэмплирован Отредактировано для примера «реального мира», который действительно должен работать.(не полностью протестировано)

Дополнительный вопрос - 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

1 Ответ

0 голосов
/ 02 апреля 2011

Я думаю, что AutoResetEvent - это класс, который вы ищете, если хотите подождать, пока что-то произойдет, прежде чем продолжать делать что-то еще.

В описании класса приведен примерстраница, в основном вы звоните WaitOne, где вы хотите ждать, и Set, когда вы хотите продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...