Hemos asumido algunos .NET 1.1 del código de servicio de Windows que genera hilos para leer mensajes de una cola (Ver más allá de la cola eGate JMS, pero eso no es importante) y genera hilos para procesar el mensaje en el servicio de aplicación de destino. Continuamente nos encontramos con decisiones de lógica y diseño que nos desconciertan sin fin. Aquí es un ejemplo, donde el mensaje (lsMessage) se ha recuperado de la cola y listo para el procesamiento¿Puede el constructor de objetos devolver un valor nulo?
if(lsMessage != null)
{
// Initialize a new thread class instance, pass in message
WorkerThread worker = new WorkerThread(lsMessage);
Process:
// Start a new thread to process the message
Thread targetWorker = new Thread(new ThreadStart(worker.ProcessMessage));
if(targetWorker != null)
{
targetWorker.Priority = ThreadPriority.Highest;
targetWorker.Name = "Worker " + queueKey.ToString();
targetWorker.Start();
// wait for worker thread to join back in specified period
bool isFinished = targetWorker.Join(SYNC_THREAD_TIMEOUT);
string message = worker.replyMsg;
if (!isFinished) // BF is timeout
{
targetWorker.Abort();
// [obscure developer name] 25/10/2004: calling Join() to wait for thread to terminate.
// for EAI listener threads problem, ensure no new thread is started
// before the old one ends
targetWorker.Join();
// prepare reply message
string errorMsg = string.Format("EAIMsg {0}: BF is timeout. Send sync message back to caller.", worker.messageKey);
log.Debug(errorMsg);
message = worker.GenErrorCode(message, errorMsg);
}
// Commit message
MQ.ReceiverCommit(queueKey, worker.messageKey, false);
// Send back the response to the caller
MQ.RespondSend(queueKey, message);
}
else
{
log.Debug(string.Format("Fail to start worker thread to process sync message. Thread returned is null. Sleep for {0} milliseconds.", LIMIT_RESOURCE_SLEEP));
Thread.Sleep(LIMIT_RESOURCE_SLEEP);
goto Process;
}
}
Por favor, ignora el uso de etiqueta y Goto por el momento; Esa no es la pregunta. Nuestro desconcierto es el comprobar si el objeto Thread es nulo justo después de la instanciación. La declaración else a continuación parece sugerir que los desarrolladores anteriores han encontrado situaciones como esta antes. Por supuesto, los desarrolladores originales desaparecieron hace mucho tiempo. Entonces, nos gustaría saber si el CLR puede crear una instancia de un objeto después de la llamada al constructor y devolver un valor nulo. No tenemos conocimiento de tal posibilidad.
Parece el resultado de una refactorización o cambio de código para mí. Tal vez la línea de construcción era algo así como 'GetThread()'. – usr