Como detectar se um EventWaitHandle está esperando?
-
19-09-2019 - |
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?
Solução
Eu não tenho certeza o que e como você gostaria de alcançar, mas você pode percorrer as WaitHandle
s 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);
}
}
}
}