C# non-blocking-socket-ohne while(true) Schleife
Ich versuche nur, um einige socket-Programmierung, Verwendung von non-blocking sockets in c#.
Die verschiedenen Beispiele, die ich gefunden habe, wie diese, scheint die Verwendung einer while(true) - Schleife, aber diese Vorgehensweise bewirkt, dass die cpu zu burst um 100%.
Gibt es eine Möglichkeit, die Verwendung von nicht-blockierende sockets mit einer event-Programmierung Stil?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie im MSDN-Beispiel hier. Das Beispiel zeigt, wie Daten zu empfangen, asynchron. Sie können auch die Buchse BeginSend/EndSend Methoden zum senden von Daten asynchron.
Sollten Sie beachten, dass die callback-Delegaten führt im Zusammenhang mit einem ThreadPool-thread. Dies ist wichtig, wenn die empfangenen Daten innerhalb der callback-muss gemeinsam mit einer anderen thread, z.B. der main-UI-thread, der zeigt die Daten in einem Windows form. Wenn dem so ist, müssen Sie die synchronisierten Zugriff auf die Daten über das
lock
Schlüsselwort, zum Beispiel.Als Sie bemerkt haben, mit nicht blockierenden sockets und einer while-Schleife, die den Prozessor gebunden ist bei 100%. Die asynchronen Modell wird nur auf das callback-Delegaten, wenn es Daten zu senden oder zu empfangen.
Zu vermeiden, ein CPU-Problem in den schweren while-Schleife, wenn keine Daten empfangen, setzen
thread.sleep(100)
oder weniger. Dass wir andere Prozesse ändern, um Ihre AufgabeReden in der Regel über blocking/non-blocking IO, gemäß den geltenden allgemein:
Das wichtigste ist, dass es im realen Leben Ihr Programm nicht anderem, während nicht tun, IO. Die Beispiele sind alle künstlich in dieser Weise.
In blocking-IO, dein thread 'Blöcke' beim warten auf IO. Der OS geht und tut andere Dinge, z.B. können andere threads ausgeführt werden. Damit Ihre Anwendung kann viele Dinge tun (konzeptionell) parallel mit vielen threads.
Im non-blocking IO, dein thread Abfragen, um zu sehen, wenn IO ist möglich, und ansonsten geht und tut etwas anderes. So müssen Sie viele Dinge parallel, indem Sie explizit - auf eine application-level - Austausch zwischen Ihnen.
Buchse.BeginReceive und AsyncCallback