Frage

In C #, wenn sie mit den BeginReceive / EndReceive Methoden Netzwerk Daten empfängt, gibt es keinen Grund, warum Sie nicht die Pakete verarbeitet werden soll, sobald Sie sie erhalten? Einige der Aufgaben anständig CPU-intensiv sein. Ich frage, weil ich einige Implementierungen gesehen habe, die die Pakete aus in eine Verarbeitungswarteschlange schieben und sie dann dort behandeln. Für mich scheint überflüssig, da, soweit ich weiß, die Asynchron-Methoden auch auf einem Thread-Pool arbeiten.

War es hilfreich?

Lösung

Wie Mitch weist darauf hin, müssen Sie in der Lage sein, genug, um Pakete zu empfangen, eine vollständige Nachricht / Frame zu haben. Aber es gibt keinen Grund, warum Sie nicht, dass die Frame-Verarbeitung sofort gestartet werden soll, und geben Sie eine andere BeginReceive. In der Tat, wenn Sie Ihre Verarbeitung glauben einige Zeit dauern könnte, sind Sie besser dran es aus dem Arbeiter-Thread-Pool verteilt eher blockieren als einen Faden von dem I / O-Pool (das ist, wo Ihr Rückruf ausgelöst wird).

Darüber hinaus, wenn Sie eine geringe Anzahl von Verbindungen erwarten, aktualisiert einen Thread Laichen jede Verbindung ist nicht sehr skalierbaren Ansatz zu handhaben, obwohl es den Vorteil einer gewissen Einfachheit hat.

Ich schrieb vor kurzem einen Artikel über Pipelining Datenverarbeitung aus einer Netzwerkbuchse, die Sie hier .

Andere Tipps

Im Allgemeinen müssen Sie ‚genug‘ Pakete empfangen, einen Datenpunkt haben, die ‚verarbeitbar‘ ist.

IMO, Es ist besser, einen Faden, dessen Jobs zu haben, ist Daten zu empfangen, und eine andere, tatsächlich es zu verarbeiten.

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