Я використовую вбудовані функції, щоб уникнути тиску збору сміття, особливо коли стосуються довших методів роботи. Скажіть, ви хочете отримати 2 роки або ринкові дані для даного символу тикера. Крім того, можна запакувати багато функціональності та ділової логіки, якщо потрібно.
що можна зробити, це відкрити сокетне з'єднання з сервером і передати цикл на дані, що прив'язують подію до події. Можна думати про це так само, як створений клас, лише один не пише усюди допоміжних методів, які справді працюють лише за одну частину функціональності. нижче наводиться приклад того, як це може виглядати, будь ласка, зауважте, що я використовую змінні, а "помічницькі" методи нижче, нарешті, нижче. Нарешті я добре видаляю обробники подій, якби мій клас 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;
}
}
Ви можете побачити переваги, як зазначено нижче, тут ви можете побачити зразок реалізації. Сподіваюся, що допоможе пояснити переваги.