Estoy escribiendo una aplicación C# Windows Form que procesa citas del mercado a través de un algoritmo (estrategia) para crear pedidos a una firma de corretaje. Todo parece estar probando bastante bien hasta que intenté construir la capacidad de ejecutar múltiples estrategias simultáneamente con cada estrategia en su propio hilo. En este punto, todo comienza a ejecutarse incorrectamente. Creo que tengo algunas clases que no son seguras para subprocesos y que generan un comportamiento errático. ¡Cualquier idea sobre cómo puedo enhebrar esto de una manera segura para los hilos es muy apreciada!Asegurando seguridad de subprocesos
La manera en que se envían las Cotizaciones a los Algoritmos es la siguiente: 1) Los Eventos de Datos de Mercado se activan desde el Software Brokers a una clase de cliente en mi Software llamado ConnectionStatus. Cuando se desencadena el evento Data del mercado, se crea un objeto Quote a partir de los valores actuales de estas variables estáticas que representan Bid, ask, etc. Una vez que se construye la cotización, me esfuerzo por enviarla a cada uno de los Algoritmos de Estrategia que están corriendo. Aquí está el código que estoy utilizando para hacer eso:
foreach (StrategyAssembler assembler in StrategyAssembleList.GetStrategies())
{
BackgroundWorker thread = strategyThreadPool.GetFreeThread();
if (thread != null)
{
thread.DoWork += new DoWorkEventHandler(assembler.NewIncomingQuote);
thread.RunWorkerAsync(quote);
}
}
StrategyAssembler es una clase que crea una instancia de la clase StrategyManager que a su vez crea una instancia de la estrategia que contiene los algoritmos reales. Puede haber 4 o 6 instancias diferentes de StrategyAssembler, cada una de las cuales se ha agregado a una instancia de Singleton de StrategyAssembleList que es una BindingList.
El objeto de comillas entrantes se pasa al método NewIncomingQuote de la clase StrategyAssembler. Ese código es el siguiente:
public void NewIncomingQuote(object sender, DoWorkEventArgs e)
{
Quote QUOTE = e.Argument as Quote;
lock (QuoteLocker)
{
manager.LiveQuote(QUOTE);
priorQuote = QUOTE;
}
}
Estaba pensando que mediante el uso de una cerradura antes de pasar a la cita en el método manager.LiveQuote (cita Cotización) que todos los objetos que utilizan la cita "aguas abajo" de este punto sería ser capaz de consumir la cotización de manera segura, pero las pruebas muestran lo contrario. ¿Hay alguna manera de poner cada instancia de StrategyAssembler en su propio hilo que asegure que todos los objetos creados por el Ensamblador de Estrategia sean seguros para hilos y luego alimentar el presupuesto en el Ensamblador de Estrategia? ¿Es esta forma de pensar una forma apropiada de lidiar con esta situación?
Gracias de antemano por cualquier comentario o ayuda,
aprendizaje1
1) ¿Qué hace 'manager.LiveQuote()' do? ¿Es la interfaz para tus métodos de estrategia? 2) ¿'QuoteLocker' es un miembro de la instancia' StrategyAssembler'? 3) Finalmente, ¿qué tipo de comportamiento esperas y qué estás viendo? –
1) gerente.Livequote() es el método que a) Agrega la cotización a una lista a la que hacen referencia Clases indicadoras y clase de algoritmo de estrategia y Clase de simulación de ordenFill b) Pasa la cotización en el algoritmo de estrategia c) Gestiona objetos de orden en la estrategia para simular el llenado de pedidos/Cancelación/latencia de comunicación, etc. – Learning1
2) QuoteLocker es un objeto estático objeto estático QuoteLocker = new object(); – Learning1