Я использую встроенные функции, чтобы избежать давления при сборке мусора, особенно при работе с более длительными методами. Допустим, вы хотите получить 2 года или рыночные данные для данного символа тикера. Кроме того, можно упаковать много функциональности и бизнес-логики, если это необходимо.
все, что нужно сделать - это открыть сокетное соединение с сервером и зациклить данные, привязывающие событие к событию. Можно думать об этом так же, как проектируется класс, только один не пишет повсеместно вспомогательные методы, которые действительно работают только для одной функциональности. ниже приведен пример того, как это может выглядеть, обратите внимание, что я использую переменные, а методы "helper" находятся ниже, наконец. Наконец, я удаляю обработчики событий, если мой класс Exchange будет внешним / внедренным, у меня не будет зарегистрирован ни один ожидающий обработчик событий.
void List<HistoricalData> RequestData(Ticker ticker, TimeSpan timeout)
{
var socket= new Exchange(ticker);
bool done=false;
socket.OnData += _onData;
socket.OnDone += _onDone;
var request= NextRequestNr();
var result = new List<HistoricalData>();
var start= DateTime.Now;
socket.RequestHistoricalData(requestId:request:days:1);
try
{
while(!done)
{ //stop when take to long….
if((DateTime.Now-start)>timeout)
break;
}
return result;
}finally
{
socket.OnData-=_onData;
socket.OnDone-= _onDone;
}
void _OnData(object sender, HistoricalData data)
{
_result.Add(data);
}
void _onDone(object sender, EndEventArgs args)
{
if(args.ReqId==request )
done=true;
}
}
Вы можете увидеть преимущества, как указано ниже, здесь вы можете увидеть пример реализации. Надеюсь, что это помогает объяснить преимущества.