Pregunta

Tengo un winforms aplicación multi-hilo bastante bien que emplea el EventWaitHandle en un número de lugares para sincronizar el acceso.

Así que tengo un código similar al siguiente:

List<int> _revTypes;
EventWaitHandle _ewh = new EventWaitHandle(false, EventResetMode.ManualReset);

void StartBackgroundTask() {
    _ewh.Reset();
    Thread t = new Thread(new ThreadStart(LoadStuff));
    t.Start();
}

void LoadStuff() {
    _revTypes = WebServiceCall.GetRevTypes()
    // ...bunch of other calls fetching data from all over the place
    // using the same pattern
    _ewh.Set();
}


List<int> RevTypes {
    get {
        _ewh.WaitOne();
        return _revTypes;
    }
}

A continuación, acabo de llamar somewehre .RevTypes de la interfaz de usuario y volverá a mí cuando los datos LoadStuff ha terminado de ejecutarse.

Todo esto funciona perfectamente bien, sin embargo RevTypes es sólo una propiedad - en realidad hay varias decenas de estos. Y una o varias de estas propiedades están soportando la interfaz de usuario de la carga de una manera rápida.

A falta de colocar el código de prueba en cada propiedad, hay una manera de ver que la propiedad es la celebración de la interfaz de usuario de la carga? ¿Hay una manera de ver si el EventWaitHandle se ve obligado a esperar en realidad?

¿Fue útil?

Solución

No estoy seguro de qué y cómo le gustaría lograr, pero se puede cambiar entre los WaitHandles con un tiempo de espera de 0 para ver si están ajustados actualmente, como:

class Program
{
    static void Main(string[] args)
    {
        EventWaitHandle[] waitHandles = new EventWaitHandle[3];
        for (int i = 0; i < 3; i++)
        {
            waitHandles[i] = new EventWaitHandle(false, EventResetMode.ManualReset);
        }
        waitHandles[1].Set();

        for (int i = 0; i < 3; i++)
        {
            if (waitHandles[i].WaitOne(0))
            {
                Console.WriteLine("Handle {0} is set", i);
            }
            else
            {
                Console.WriteLine("Handle {0} is not set", i);
            }
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top