Frage

Ich versuche nur, um etwas Socket-Programmierung zu machen, indem nicht-blockierende Sockets in c #. Die verschiedenen Proben, die ich gefunden habe, wie dieser , scheint verwendet eine while (true) Schleife, aber dieser Ansatz bewirkt, dass die CPU bei 100% platzen. Gibt es eine Möglichkeit non-blocking-Buchsen mit einem Event-Programmierung Stil zu benutzen? Dank

War es hilfreich?

Lösung

Sehen Sie das MSDN Beispiel hier . Das Beispiel zeigt, wie Daten asynchron empfangen. Sie können auch die Sockel Begin / EndSend Methoden asynchron Daten zu senden.

Sie sollten beachten, dass der Callback-Delegat im Rahmen eines Threadpool-Thread ausgeführt wird. Dies ist wichtig, wenn die Daten innerhalb des Rückrufs empfangen muss mit einem anderen Thread gemeinsam genutzt werden, beispielsweise dem Haupt-UI-Thread, die Daten in einer Windows-Form zeigt. Wenn ja, müssen Sie synchronisierten Zugriff auf die Daten des lock Schlüsselwort, zum Beispiel.

Wie Sie bemerkt haben, mit nicht-blockierenden Buchsen und einer while-Schleife ist der Prozessor bei 100% gebunden. Das asynchrone Modell wird nur die Callback-Delegaten aufrufen, wenn es Daten zu senden oder zu empfangen.

Andere Tipps

ein CPU Problem zu vermeiden, in schweren while-Schleife, wenn keine Daten thread.sleep(100) oder weniger gesetzt erhalten. Das läßt andere Prozesse ändern, um ihre Aufgabe zu tun

Im Gespräch im Allgemeinen über Blockierung / non-blocking IO, allgemein anwendbar:

Das Wichtigste ist, dass im wirklichen Leben Ihres Programm tut andere Dinge , während nicht IO tun. Die Beispiele sind alle auf diese Weise ersonnen.

In Sperrung IO, den Thread 'Blöcke', während für IO warten. Das Betriebssystem geht und tut andere Dinge, zum Beispiel ermöglicht es anderen Threads ausgeführt werden. So Ihre Anwendung kann viele Dinge tun (gedanklich) parallel durch viele Threads verwenden.

In non-blocking IO, die Thread-Abfragen zu sehen, ob IO möglich ist, und sonst geht und tut etwas anderes. Sie brauchen also viele Dinge parallel explizit - auf Anwendungsebene - zwischen ihnen tauschen

.

Socket.BeginReceive und AsyncCallback

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