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?

War es hilfreich?

Lösung

Ich bin mir nicht sicher, was und wie möchten Sie erreichen, aber Sie können durch die WaitHandles 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);
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top