Класс 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