2009-08-06 7 views
1

Ich habe ein Problem mit der Schnittstellenverzögerung in C#.Wie reduziere ich die Schnittstellenverzögerung in C#?

Da ich noch lerne bitte habe etwas Geduld während ich es erkläre.

Ich habe das Problem auf mein Timer-Objekt eingegrenzt.

Grundsätzlich mein Programm fragt ein Gerät über TCP/IP-Socket und gibt es an ein Textfeld auf dem Bildschirm.

Jetzt bin ich Polling das Gerät für Daten in jeder Sekunde, die eine gewisse Logik innerhalb Timer-Objekt zu begraben erfordert und das folgende ist, was zwischen Zecken passiert:

  1. Erhöhungsschritte ein Wert.
  2. Konstruieren Sie die 2-Strings, die der Befehl an die Box in einer Funktion gekapselt gesendet werden repräsentiert (
  3. Encode der Befehl
  4. Befehl Senden
  5. Deaktivieren Sie das Byte-Array
  6. Antwort.

Könnte dies zu viel Verarbeitung in der Event-Handler erfolgen werden? Jedes Mal, wenn ich versuchen, das Fenster während der Abfragesitzung dh zu bewegen, wenn der Timer ich einen sehr schlechten Input-Lag läuft bekommen.

+0

Vielen Dank Ihnen allen für Ihre Antworten. Es brachte mich dazu, eine ganze Reihe von Artikeln zu lesen, die meinen Kopf weh taten, aber gab mir ein grobes Bild von dem, was hier passiert; –

Antwort

11

Der Timer, den Sie verwenden, wird auf dem Windows-Nachrichtenthread ausgeführt. Während die Abfrage ausgeführt wird, wird daher die Windows-Nachrichtenwarteschlange blockiert. Dies ist kein Problem mit zu viel Verarbeitung, die meiste Zeit wird der Thread auf die TCP/IP-Antwort warten.

Um dies zu beheben, müssen Sie nur noch die die Arbeit auf einem Hintergrund-Thread tun tun und dann die Benutzeroberfläche auf dem UI-Thread zu aktualisieren.

Es gibt einen Haufen verschiedenen Timer in .NET Framework, die auf unterschiedliche Weise arbeiten, die, die Sie Werke verarbeitet, um das Timer-Ereignis auf dem gleichen Thread verwenden, andere arbeiten auf Hintergrund-Threads. Check this article out about the different timers.

Sie können auch Ihre aktuelle Timer verwenden nur einen Backgroundworker-Komponente aufzurufen, die Arbeit auf dem Hintergrund-Thread zu tun. Der Hauptvorteil davon ist, dass der BackgroundWorker die Arbeit an einem Hintergrundthread erledigt, aber das work complete-Ereignis im UI-Thread auslöst, so dass es einfach ist, die UI zu aktualisieren, ohne sich darum kümmern zu müssen, auf welchem ​​Thread Sie sich befinden.

+0

Ich habe jetzt alles probiert (BackgroundWorker, separater Thread) aber egal was ich mache, meine UI wird immer noch Hostage für die Dauer des Polling-Zeitraums gehalten, in den meisten Fällen bin ich nicht einmal in der Lage, den Abrufvorgang zu unterbrechen (außer Ich schlafe den Arbeitsfaden) Ich bin jetzt nicht imstande, diese Logik zu implementieren. –

1

Es scheint, als gäbe es ein paar Dinge. Erstens können Sie in Ihrem Timer-Tick-Handler zu viel tun. Wie konstruieren Sie die Zeichenfolge und codieren den Befehl? Kann dies einmal außerhalb des Tick-Handlers durchgeführt oder in irgendeiner Weise vereinfacht werden (z. B. mit String.Format-Aufrufen)? Es gibt tatsächlich drei verschiedene Timer in .NET mit unterschiedlichen Auflösungen. Welchen Timer verwendest du?

Das größte Problem ist die Tatsache, dass Ihr Intervall 1 Sekunde ist. Egal was, das ist eine Menge Verarbeitungsaufwand. Denken Sie daran, dass Sie jedes Mal, wenn das Intervall erreicht wird und der Tick-Handler aufgerufen wird, einen Kontextwechsel zwischen Threads verursachen. Es gibt ein wenig Aufwand in diesem (nichts was Sie tun können) und je öfter Sie Kontext wechseln desto langsamer Ihre Leistung erscheint.

2

Ich denke, das liegt daran, dass Sie versuchen, in Ihrem UIhread zu arbeiten. Lassen Sie Ihren Timer in einem Hintergrundarbeits-Thread laufen.

Verwandte Themen