9 de enero de 2012

Alto consumo de memoria en WaWorkerHost.exe

La versión en inglés de este post puede ser encontrada en http://blogs.southworks.net/jrowies/2012/01/09/high-memory-consumption-in-waworkerhost-exe/

Cuando el consumo de memoria del proceso WaWorkerHost.exe comienza a subir sin razón aparente, y estamos usando Tasks en nuestro worker role, puede que haya llegado el momento de verificar excepciones no manejadas y comenzar a manejarlas correctamente.

Lanzar excepciones desde una Task en un worker role y NO manejarlas correctamente:

    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            while (true)
            {
                Task.Factory.StartNew(() => { throw new NotImplementedException(); });
                Thread.Sleep(100);
            }
        }
    }

Puede causar este consumo elevado de memoria en el proceso WaWorkerHost.exe:


NOTA: WaWorkerHost.exe es el proceso encargado de alojar los worker roles cuando los mismos corren en el emulador.

Debajo se puede encontrar una manera de manejar excepciones lanzadas en Tasks.

    public class WorkerRole : RoleEntryPoint
    {
        public override void Run()
        {
            while (true)
            {
                Task.Factory.StartNew(
                    () => 
                    { 
                        throw new NotImplementedException(); 
                    })
                    .ContinueWith((t) =>
                    {
                        Trace.WriteLine(string.Format("Exception in Worker Role: {0}", 
                            t.Exception.InnerException.ToString()));
                    },
                    TaskContinuationOptions.OnlyOnFaulted);

                Thread.Sleep(100);
            }
        }
    }

No hay comentarios:

Publicar un comentario