2016-11-16 3 views
0

Ich arbeite an einem Dienst, der bis zu 30.000 Remote-Geräte verwaltet.Warum sollte ich BeginWrite anstelle von Write verwenden?

Bei einigen Belastungstests scheint es, als ob die asynchrone Methode BeginWrite mehr Ressourcen als reguläres Write verwendet (ich denke aufgrund des Overheads, der benötigt wird, um einen Callback-Thread zu erstellen); Auf der anderen Seite gibt die Write-Methode immer schneller als BeginWrite zurück.

Also meine Frage ist: Was ist der Grund, BeginWrite zu bevorzugen?

Eine andere Frage ist: Gibt es einen Grund, ein WriteTimeout für Sync Write zu setzen? In welchen Fällen erzeugt die Write-Methode keine sofortige Ausnahme (z. B. aufgrund eines geschlossenen Sockets), wird aber nicht in angemessener Zeit abgeschlossen?

EDIT: Ich habe eine Reihe von Worker-Threads (32 oder 64), so dass ich Daten an 500-1000 Geräte auf einmal senden und scheint scheint besser als BeginWrite zu arbeiten.

EDIT 2: Nach ein wenig Suche verstehe ich, dass Sync Write nur hängt, wenn der Schreibpuffer voll ist. Die Standardschreibpuffergröße beträgt 8 KB, und ich sende 1-2 KB Daten auf einmal, daher sollte Write in meiner Anwendung niemals hängen bleiben und es ist besser, dass BeginWrite. Ich habe eine Sicherheit WriteTimeout von 1 Sekunde eingestellt.

+0

Senden Sie Daten gleichzeitig an alle Remote-Geräte? Können Sie uns den Code Ihres Tests zeigen? –

+0

Ich sende Daten an 500-1000 Geräte auf einmal. – ElmoDev001

+0

Es ist ein sehr, sehr großes Projekt, also Code zu zeigen, ist nicht einfach. – ElmoDev001

Antwort

2

Skalierbarkeit.

Synchrone Aufrufe blockieren den Thread, während sie abgeschlossen sind. Asynchrone Methoden nicht. Abhängig davon, wie viele gleichzeitige Anforderungen Sie bearbeiten, spielt dies eine Rolle.

+0

Dies ist der Grund, warum ich async schreiben versucht habe, aber was ich in meinen Tests gesehen habe, ist, dass Write auch mit vielen (500-1000) der heutigen Schreiboperationen besser funktioniert (aber auf verschiedenen Sockets, also nicht gleichzeitigem Schreiben). – ElmoDev001

+0

Nun, immer messen, weil YMMV. Dennoch, 1000 mag jetzt dein Maximum sein, aber in der Zukunft ... Und es ist nicht der spezifische Kanal (Socket in diesem Fall), den du zu konservieren versuchst - es sind Threads. Sie sind eine endliche Ressource. – n8wrl

Verwandte Themen