Frage

Ein paar Worte über einen laufenden Entwurf und die Implementierung

Ich habe viele Anfragen an die Remote-Anwendung senden (läuft auf einem anderen Host, natürlich), und die Anwendungsdaten zurückzuschicken.

Über Client

Client ist eine Benutzeroberfläche, die einen separaten Thread laichen die Anträge einzureichen und zu verarbeiten. Nachdem er alle Anfragen vorträgt, nennt es warten. Und das Warten wird alle Ereignisse analysieren, um die App kommen und Client-Rückrufe aufzurufen.

Im Folgenden ist die Umsetzung warten.

public void Wait (uint milliseconds)
{
       while(_socket.IsConnected)
       {
         if (_socket.Poll(milliseconds, SelectMode.SelectRead))
         {
              // read info of the buffer and calls registered callbacks for the client
              if(_socket.IsAvailable > 0)
                    ProcessSocket(socket);
         }
         else
            return; //returns after Poll has expired
      }
}

Die Warten Sie von einem separaten Thread aufgerufen wird, verantwortlich für die Verwaltung von Netzwerkverbindung: sowohl eingehender als auch ausgehender Datenverkehr:

         _Receiver = new Thread(DoWork);
         _Receiver.IsBackground = true;
         _Receiver.Start(this);

Dieser Thread aus UI-Komponente der Anwendung erstellt wird.

Die Frage:

Client sieht manchmal Verzögerungen bei den Rückrufen obwohl Hauptanwendung der Daten rechtzeitig gesendet hat. Bemerkenswert ist, wurde eine die Nachricht in der Abstimmung verzögert, bis ich Client getrennt und intern Ich rief:

_socket.Shutdown(SocketShutdown.Both);

Ich denke, etwas flippiger geschieht in der Poll

Alle Vorschläge, wie das Problem oder eine alternative Lösung zu beheben?

Danke

Bitte lassen Sie mich wissen, wenn etwas unklar ist,

War es hilfreich?

Lösung

Ein paar Dinge. Zuerst in Ihrem Beispiel gibt es einen Unterschied zwischen „_socket“ und „Buchse“? Zweitens Sie verwenden die System.Net.Sockets.Socket Klasse, nicht wahr? Ich weiß nicht IsConnected oder IsAvailable Eigenschaften auf dieser Klasse in der MSDN-Dokumentation für jede .NET-Version geht zurück auf 1.1 sehen. Ich gehe davon aus das sind beiden Tippfehler, nicht wahr?

Haben Sie versucht, eine „else“ Klausel über die „IsAvailable> 0“ Probe zu stellen und eine Nachricht an die Konsole / Ausgabefenster zu schreiben, z. B.

  if (_socket.IsAvailable > 0) {
      ProcessSocket(socket);
  } else {
      Console.WriteLine("Poll() returned true but there is no data");
  }

Dies könnten Sie eine Vorstellung davon, was man in dem größeren Kontext des Programms los werden.

Abgesehen davon, ich bin kein großer Fan von Polling-Buchsen für Daten. Als Alternative gibt es einen Grund, nicht die asynchronen Start / EndReceive Funktionen auf dem Sockel zu benutzen? Ich denke, dass es einfach sein würde, um das asynchrone Modell angesichts der Tatsache zu konvertieren, dass Sie bereits einen eigenen Thread mit Ihren Daten zu senden und empfangen. Hier ist ein Beispiel von MSDN. Außerdem habe ich die typische Implementierung hinzugefügt, dass ich diesen Mechanismus verwenden, um diese SO Post .

Andere Tipps

Was Faden wird das Wait () -Methode aufrufen? Wenn Sie nur in den UI Thread werfen, sein, dass ich vielleicht, warum Sie Verzögerungen manchmal erleben. Wenn dies Ihr Problem ist, dann das System Thread entweder verwenden, erstellen Sie einen neuen nur für die Vernetzung Teile der Anwendung oder einen speziellen Thread erzeugt für sie.

Darüber hinaus ist es schwer, Ihnen viel zu helfen, ohne mehr Code zu sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top