Question

J'ai quelque chose Wich me semble comme condition de course lors de la connexion à déposer à partir filetage multiple.

1) J'ai une classe d'enregistreur personnalisé (ConfigurableTraceLogger) qui est partagée par plusieurs threads dans ma demande. Il est a beaucoup de fonctions wrapper qui tous les appels à la fonction principale de base

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();
        }
    }
}

Comme vous pouvez le voir ma classe stocke simplement différentes classes de TraceListner-derved dans une collection _les auditeurs. Fondamentalement, il n'y a que les auditeurs fichier console et texte. Qu'est-ce que le fait TraceData il prend le nom de la catégorie (à savoir le démarrage de l'exploitation forestière up) et trouve l'auditeur droit. Tous les auditeurs sont définis par le nom du fichier de configuration

Maintenant, j'ai aussi mes auditeurs personnalisés dans la collection

public class ConfigurableTextWriterTraceListener : TextWriterTraceListener, IConfigurableTraceListener

Cette classe personnalisée remplace rien, sauf pour une propriété.

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

Quand je commence ma demande après 5 à 10 minutes, je me exception sur l'appel

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

Exception dit:

"probable condition de course E / S détectée lors de la copie mémoire. Le paquet d'E / S est pas thread-safe par défaut. Dans les applications multithread, un flux doit être accessible de manière thread-safe, comme un fil emballage -safe retourné par TextReader ou de méthodes de synchronisé TextWriter. Cela vaut également pour les classes comme StreamWriter et StreamReader. "

Après que je continue à recevoir des deuxième lots exception des temps sur le même appel à

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

Exception

Count ne peut pas être inférieur à zéro. Nom du paramètre: nombre Trace de la pile: "à System.String.CopyTo (Int32 SourceIndex, compte Char [] destination, Int32 destinationIndex, Int32) \ r \ n à System.IO.StreamWriter.Write (valeur String) \ r \ n à System.Diagnostics. TextWriterTraceListener.Write (message String) \ r \ n à System.Diagnostics.TraceListener.WriteHeader (source String, TraceEventType eventType, id Int32) \ r \ n à System.Diagnostics.TraceListener.TraceData (TraceEventCache eventCache source String, TraceEventType eventType , id Int32, objet de données) \ r \ n à Jfc.Configuration.ConfigurableTraceLogger.TraceData (catégorie String, type TraceEventType, id EventId, préfixe chaîne, le format String, Object [] args) "

Il me semble que ma classe est pas thread-safe et l'appel à TraceData. Mais ConfigurableTextWriterTraceListener est dit thread-safe après tout. Cependant j'ai vérifié propety isThreadSafe pour ma TextWriterTraceListener classe dérivée à l'exécution et faux. Je suis en train de comprendre où est le problème.

Était-ce utile?

La solution

Cela signifie que dit - votre TraceListener est pas thread-safe et des pauses lors de l'accès de plusieurs threads. Vous devez faire vos auditeurs thread-safe ou trouver un moyen de faire en sorte que seul thread accède à une instance particulière.

Une façon de les rendre thread-safe est d'utiliser une file d'attente synchronisée et de faire tous vos appels ENQUEUE éléments de données à la file d'attente alors que le « réel » TraceListener les dequeues et les écrit dans un thread séparé.

Vous devez aussi être prudent avec votre dictionnaire d'auditeurs - mise à jour du dictionnaire est pas thread-safe, mais si vous ne l'accès avant la dernière mise à jour est appliquée, vous pouvez le laisser comme il est

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top