4 Stimmen

Thread läuft langsam beim Aufrufen des UI-Elements

Ich programmiere ein Benchmark-Tool, das in einem Thread eine Reihe von Variablen von einem lokalen Server liest.

            int countReads = 1000;

            Int64 count = 0;

            for (int i = 0; i < countReads; i++)
            {
                Thread.CurrentThread.Priority = ThreadPriority.Highest;
                DateTime start = DateTime.Now;

                session.Read(null, 0, TimestampsToReturn.Neither, idCollection, out ReadResults, out diagnosticInfos);

                DateTime stop = DateTime.Now;
                Thread.CurrentThread.Priority = ThreadPriority.Normal;

                TimeSpan delay = (stop - start);

                double s = delay.TotalMilliseconds;
                count += (Int64)s;

                Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
                {
                    progressBar1.Value = i;
                }));
            }

            double avg = (double)count / countReads;

            Dispatcher.Invoke(DispatcherPriority.Input, new Action(() =>
            {
                listBox1.Items.Add(avg);
            }));

Ich berechne die Zeitspanne, die für den Lesevorgang benötigt wurde, und ermittle die durchschnittliche Zeitspanne am Ende.

            DateTime start = DateTime.Now;

            session.Read(null, 0, TimestampsToReturn.Neither, idCollection, out ReadResults, out diagnosticInfos);

            DateTime stop = DateTime.Now

Wenn ich den Code ohne Aktualisierung des Fortschrittsbalkens ausführe, dauert es im Durchschnitt etwa 5 ms. aber wenn ich es mit

            Dispatcher.Invoke(DispatcherPriority.Render, new Action(() =>
            {
                progressBar1.Value = i;
            }));

dauert es im Durchschnitt etwa 10 ms.

Meine Frage ist, warum ist die Zeitspanne höher, wenn ich den Fortschrittsbalken verwende? Ich berechne nur die Zeitspanne für das Lesen. Die Aktualisierung des Fortschrittsbalkens wird nicht berücksichtigt.

Gibt es eine Möglichkeit, die ui-Bemalung zu entfernen, so dass sie sich nicht auf meine Lesezeit auswirkt?

Vielen Dank für Ihre Hilfe.

Mit freundlichen Grüßen

2voto

Nicolas Repiquet Punkte 8707

Hier ist, was MSDN sagt über Dispatcher.Aufrufen

Führt den angegebenen Delegaten aus synchron auf dem Thread, mit dem der Dispatcher verbunden ist.

Also, im Grunde, Dispatcher.Invoke blockiert, bis der Dispatcher-Thread die Anfrage bearbeitet hat.

試してみる Dispatcher.BeginInvoke stattdessen.

0voto

sll Punkte 59134

Wenn der aktuell ausgeführte Thread mit dem von Ihnen verwendeten Dispatcher verbunden ist - Invoke() wird diesen Thread blockieren, also versuchen Sie in diesem Fall, mit Dispatcher.BeginInvoke() wird die Aufgabe asynchron erledigt.

MSDN, Methode Dispatcher.Invoke :

Invoke ist eine synchrone Operation; daher kehrt die Kontrolle nicht an das aufrufende Objekt zurück, bis der Callback zurückkehrt.

Übrigens, nur mal so nebenbei: Probieren Sie aus DispatcherPriority.Send

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X