Uso funções in-line para evitar a pressão da coleta de lixo, especialmente quando se lida com métodos de execução mais longos. Digamos que você queira obter 2 anos ou dados de mercado para um determinado símbolo. Além disso, é possível incluir muitas funcionalidades e lógica de negócios, se necessário.
o que se faz é abrir uma conexão de soquete ao servidor e fazer um loop sobre os dados que vinculam um evento a um evento. Pode-se pensar da mesma maneira que uma classe é projetada, apenas uma não está escrevendo métodos auxiliares em todo o lugar que realmente estão trabalhando apenas para uma peça de funcionalidade. Abaixo está um exemplo de como isso pode parecer, observe que estou usando variáveis e os métodos "helper" estão abaixo do finalmente. No Finalmente, removo bem os manipuladores de eventos, se minha classe do Exchange fosse externa / injetada, não haveria nenhum manipulador de eventos pendente registrado
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;
}
}
Você pode ver as vantagens mencionadas abaixo, aqui você pode ver uma implementação de amostra. Espero que ajude a explicar os benefícios.