2010-02-08 19 views
6

¿Hay alguna herramienta disponible para el perfil .Net Discusión del hilo. He agregado un contador de rendimiento para los hilos de un servicio de Windows que se está ejecutando lentamente. Muestra alrededor de 150 conflictos de hilos. Me gustaría crear un perfil de qué área del código es responsable de gran parte de las disputas de subprocesos. ¿Hay alguna herramienta disponible que pueda indicarme los bloques de código correctos?Creación de perfiles .Net thread contention

Respuesta

2
+0

Sí, estoy buscando algo así. Pero desafortunadamente estoy en VS.Net 2005 – Amitabh

+0

@Amitabh: puede descargar VS2010 aquí: http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx –

+2

VS2010 puede orientar .NET 2.0. Solo necesita actualizar los archivos del proyecto (.csproj, .vbproj) y las soluciones (.sln). No es necesario migrar el código. No estoy seguro de si puede usar el generador de perfiles con proyectos .NET 2.0, pero creo que vale la pena. –

0

No es un generador de perfiles, pero windbg con la extensión sosex.dll puede decirle qué interbloqueos tiene. Búsquelo here y lea sobre el comando! Dlk.

2

Me encontré con el mismo problema con un proyecto de Visual Studio 2008, por lo que no pude usar el generador de perfiles de contención de hilos de VS2010. En su lugar, escribí una clase de diagnóstico, TimedMonitor, que rastrea la cantidad de tiempo que se pasa esperando bloqueos.

Para usarlo, debería reemplazar:

object myLock = new object(); 
lock (myLock) { /* do work */ } 

con:

TimedMonitor timedLock = new TimedMonitor(); 
using (timedLock.Lock()) { /* do work */ } 
Console.WriteLine("Lock was entered {0} times; total wait time: {1}.", 
    timedLock.EnterCount, timedLock.WaitTime); 

Si sólo está utilizando un pequeño número de bloqueos simples (es decir, con Monitor.Enter o el bloqueo palabra clave), reemplazarlos con TimedMonitor y registrar el resultado puede ayudar a identificar qué bloqueo es responsable de la mayor cantidad de tiempo de espera. Sin embargo, si está utilizando bloqueos administrados más complejos (por ejemplo, ReaderWriterLock) o sincronización nativa (por ejemplo, ManualResetEvent), no será útil, ya que no los rastrea.

Cuestiones relacionadas