Pregunta

Tengo algo wich me parece condición de carrera al registrar a presentar a partir hilo múltiple.

1) Tengo una clase de logger personalizado (ConfigurableTraceLogger) que es compartida por múltiples hilos en mi solicitud. Se tiene un montón de funciones de contenedor, que todas las llamadas a la función principal del núcleo

protected void TraceData(String category, TraceEventType type, EventId id, string prefix, string format)
{
    foreach (TraceListener item in _listeners)
    {
        IConfigurableTraceListener cl = item as IConfigurableTraceListener;

        if (cl != null && cl.Category == category.ToLower())
        {

            if (DisplayMethodName)
                item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);
            else
                item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, format);

            item.Flush();
        }
    }
}

Como se puede ver mi clase simplemente almacena diferentes clases TraceListner-derved en una colección _listeners. Básicamente sólo hay oyentes consola y archivos de texto. Lo que hace TraceData que toma el nombre de la categoría (es decir, el registro de arranque) y encuentra el oyente derecha. Todos los oyentes se definen por nombre de archivo de configuración

Ahora también tengo mis oyentes personalizados en la colección

public class ConfigurableTextWriterTraceListener : TextWriterTraceListener, IConfigurableTraceListener

Esa clase personalizada anula nada a excepción de una propiedad.

protected override string[] GetSupportedAttributes()
{
    return new string[] { "category" };
}

Cuando comienzo mi solicitud después de 5 a 10 minutos llego excepción en la llamada

           item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

Excepción está diciendo:

"I / O condición de carrera probable detectado durante la copia de la memoria. El paquete de E / S no es hilo de seguridad por defecto. En las aplicaciones multitarea, una corriente se debe acceder de manera segura para los subprocesos, como un hilo envoltorio -safe devuelto por TextReader de métodos sincronizados o de TextWriter. Esto también se aplica a las clases como StreamWriter y StreamReader ".

Después de eso me siguen dando segundas porciones de excepción de veces en la misma llamada a

item.TraceData(new TraceEventCache(), _instanceName, type, (int)id, prefix + format);

Excepción

cantidad no puede ser menor que cero. Nombre de parámetro: recuento Seguimiento de la pila: "en System.String.CopyTo (Int32 sourceIndex, Char [] destino, Int32 destinationIndex, recuento Int32) \ r \ n en System.IO.StreamWriter.Write (Valor de la cadena) \ r \ n en System.Diagnostics. TextWriterTraceListener.Write (mensaje String) \ r \ n en System.Diagnostics.TraceListener.WriteHeader (fuente String, TraceEventType eventType, Int32 id) \ r \ n en System.Diagnostics.TraceListener.TraceData (TraceEventCache EventCache, fuente String, TraceEventType eventType , Int32 Identificación, objeto de datos) \ r \ n en Jfc.Configuration.ConfigurableTraceLogger.TraceData (categoría de cadena, escriba TraceEventType, EventId Identificación, cadena de prefijo, formato String, Object args []) "

Me parece que mi clase no es hilo de seguridad, así la llamada a TraceData. Pero ConfigurableTextWriterTraceListener se dice que es seguro para subprocesos, después de todo. Sin embargo he comprobado isThreadSafe Propety para mi clase derivada TextWriterTraceListener en tiempo de ejecución y es falso. Estoy tratando de averiguar dónde está el problema.

¿Fue útil?

Solución

Esto significa lo que dice - el TraceListener no es hilo de seguridad y se rompe cuando se accede desde varios hilos. Es necesario para hacer que sus oyentes hilo de seguridad o encontrar una manera de asegurar que sólo un hilo accede a cualquier caso particular.

Una forma de hacerlos hilo de seguridad es utilizar una cola sincronizado y hacer todas sus llamadas Enqueue elementos de datos a la cola mientras que el 'verdadero' TraceListener ellos Retiros de cola y las escribe en un hilo separado.

También hay que tener cuidado con su diccionario de oyentes - la actualización del diccionario no es hilo de seguridad, pero si nunca acceder a él antes de aplicar la última actualización, puede dejar como está

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top