Condividi tramite


Log eventi e componenti multithreading

I log eventi vengono utilizzati per tenere traccia degli eventi significativi quando è in esecuzione un'applicazione.Utilizzando i log eventi è possibile registrare informazioni utili per la risoluzione dei problemi o l'analisi delle prestazioni.Quando si registrano gli eventi con i componenti multithreading è necessario tenere presente alcune considerazioni aggiuntive.Innanzitutto, è necessario disporre di un meccanismo per la registrazione dell'identità del thread che registra il messaggio.In secondo luogo, quando si interagisce con il log eventi, è necessario prendere in considerazione la funzionalità di thread-safe.È necessario che il thread che tenta di scrivere un messaggio ottenga un blocco esclusivo sul log al fine di evitare il verificarsi di race condition.Per un'introduzione ai log eventi, vedere Gestione dei log eventi.Per ulteriori informazioni sulla funzionalità di thread-safe, vedere Componenti thread-safe.

Per identificare ciascun thread, è necessario impostare la proprietà Thread.Name.Questa proprietà accetta e restituisce un valore String e può essere utilizzata per impostare un identificatore univoco per ciascun thread.È quindi possibile passare questo valore al metodo EventLog.CreateEventSource per designare il thread come origine eventi per ciascun thread.Durante la registrazione degli eventi il thread può impostare la proprietà Source del log eventi sul proprio nome, assicurando in tal modo una registrazione accurata degli eventi.

Quando si eseguono più righe di codice in un ambiente multithreading, è importante che i thread ottengano blocchi esclusivi sul log eventi prima dell'esecuzione del codice.Considerare ad esempio le seguenti righe di codice eseguite in un ambiente multithreading:

MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString
EventLog.WriteEntry("What thread did this come from?", "myApplication")
MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString();
EventLog.WriteEntry("What thread did this come from?", "myApplication");

Se più thread eseguono queste righe contemporaneamente, un thread potrà modificare la proprietà EventLog.Source del log eventi, mentre un altro thread potrà scrivere un messaggio dopo la modifica di tale proprietà.Per evitare che si verifichino situazioni simili, è possibile utilizzare l'istruzione SyncLock (Visual Basic) o lock (C#) per ottenere un blocco esclusivo sull'oggetto prima dell'esecuzione del codice da più thread.Se si utilizza il blocco, l'esempio precedente assumerà il seguente aspetto:

SyncLock MyEventLog
   MyEventLog.Source = System.Threading.Thread.CurrentThread.Name.ToString
   EventLog.WriteEntry("What thread did this come from?", "myApplication")
End SyncLock
lock(MyEventLog)
{
   MyEventLog.Source = Threading.Thread.CurrentThread.Name.ToString();
   EventLog.WriteEntry("What thread did this come from?", 
      "myApplication");
}

È inoltre possibile utilizzare le classi Debug e Trace per registrare gli eventi che si verificano in applicazioni multithreading.Queste classi sono classi statiche che consentono di inviare l'output alla finestra di output, alla finestra della console, a un file di testo o a un log eventi o a numerosi altri oggetti.Per ulteriori informazioni, vedere Tracciatura e strumentazione di applicazioni in Visual Basic e Visual C#.

Vedere anche

Attività

Procedura: registrare eventi per componenti multithreading

Altre risorse

Multithreading nei componenti