Pergunta

Eu tenho um winforms multi-threaded aplicativo razoavelmente bem que emprega o EventWaitHandle em um número de lugares para acesso de sincronização.

Então, eu tenho código semelhante a este:

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

Então eu apenas chamar somewehre .RevTypes da UI e ele irá retornar os dados para mim quando LoadStuff terminar a execução.

Todos os Isso funciona perfeitamente corretamente, no entanto RevTypes é apenas uma propriedade - na verdade existem várias dezenas destes. E uma ou várias dessas propriedades estão segurando a interface do usuário a partir de carga de uma forma rápida.

curto de colocar código de referência em cada propriedade, há uma maneira de ver qual a propriedade está segurando a UI de carregamento? Existe uma maneira para ver se o EventWaitHandle é forçado a realmente esperar?

Foi útil?

Solução

Eu não tenho certeza o que e como você gostaria de alcançar, mas você pode percorrer as WaitHandles com um tempo limite de 0 para ver se eles são definidos no momento, 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top