Comment détecter si un EventWaitHandle attend?
-
19-09-2019 - |
Question
J'ai assez bien WinForms multi-thread application qui utilise le EventWaitHandle dans un certain nombre d'endroits pour synchroniser l'accès.
J'ai donc un code similaire à ceci:
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;
}
}
Je viens d'appeler .RevTypes
somewehre de l'interface utilisateur et il retournera me données lorsque LoadStuff
a terminé son exécution.
Tout cela fonctionne parfaitement bien, mais RevTypes
est juste une propriété - il y a en fait plusieurs dizaines de ces derniers. Et un ou plusieurs de ces propriétés se maintiennent l'interface de chargement d'une manière rapide.
Court de placer le code de référence dans chaque propriété, est-il un moyen de voir quelle propriété détient l'interface de chargement? Est-il possible de voir si le EventWaitHandle est forcé d'attendre réellement?
La solution
Je ne sais pas quoi et comment vous voulez atteindre, mais vous pouvez faire défiler les WaitHandle
s avec un délai d'attente de 0
pour voir si elles sont actuellement définies comme:
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);
}
}
}
}