Wie zu erkennen, ob ein Eventwaithandle wartet?
-
19-09-2019 - |
Frage
Ich habe eine ziemlich gut Multi-Threaded-WinForms-Anwendung, die die Eventwaithandle in einer Reihe von Orten zu synchronisieren Zugriff beschäftigt.
Also ich habe Code ähnlich wie diese:
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;
}
}
Dann rufe ich nur .RevTypes
somewehre von der Benutzeroberfläche und es werden Daten an mich zurück, wenn LoadStuff
Ausführung beendet hat.
Alle diese funktioniert perfekt richtig, aber RevTypes
ist nur eine Eigenschaft - es gibt tatsächlich mehrere Dutzend davon. Und eine oder mehrere dieser Eigenschaften halten die Benutzeroberfläche von Laden auf eine schnelle Art und Weise auf.
Short von in jede Eigenschaft Benchmark-Code platzieren, ist es eine Möglichkeit, um zu sehen, welche Eigenschaft die Benutzeroberfläche von Laden hält? Gibt es eine Möglichkeit, um zu sehen, ob das Eventwaithandle tatsächlich warten gezwungen wird?
Lösung
Ich bin mir nicht sicher, was und wie möchten Sie erreichen, aber Sie können durch die WaitHandle
s mit einem Timeout von 0
zu sehen, ob sie zur Zeit eingestellt sind, wie:
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);
}
}
}
}