2016-06-20 16 views
0

Implementierung mit C++/CX. Aus dem DataReaderWriter-Beispiel wird angegeben, dass wir detachStream() vor dem DataWriter-Objekt absetzen sollten, damit der Stream nicht geschlossen wird. Aber in anderen DataWriter/DataReader-Beispielcodes fand ich keine weiteren Beweise, die darauf hindeuten, dass dies eine Voraussetzung ist, und die Dokumente erwähnen nichts mehr Details. Meine Frage ist, wann sollten wir Stream() trennen? Wenn zum Beispiel ein StreamSocket-Objekt das DataWriter-Objekt überlebt, muss ich den Stream stream()? Oder ist dies nur erforderlich, wenn keine anderen Referenzen die Lebensdauer des zugrunde liegenden Stream-Objekts enthalten? Eine weitere Frage zu DataWriter/DataReader: Nachdem wir StoreAnsync/LoadAsync in Thread A aufgerufen haben, können wir WriteXXX/ReadXXX in Thread A ohne Block weiter aufrufen, der darauf wartet, dass Store/Load abgeschlossen ist?Wann sollten wir Stream von DataWriter und DataReader trennen? Und was ist die allgemeine Richtlinie dieses I/O-Modells?

Antwort

0

Meine Frage ist, wann sollten wir trennenStream()?

Als comments in DataReaderWriter Probe gesagt:

Um die Lebensdauer des Stroms zu verlängern, ist es aus den Datawriter zu lösen, so dass er nicht geschlossen wird, wenn das Datawriter zerstört wird. Würden wir den Stream nicht trennen können, würde der Destruktor DataWriter den zugrunde liegenden Stream schließen, was die nachfolgende Verwendung durch den DataReader verhindert.

Die DetachStream Methode wird hier verwendet, da der zugrunde liegende Stream Bedarf wird durch die nachfolgenden DataReader verwendet werden. Wenn wir es nicht von der DataWriter trennen, wird es geschlossen, wenn die dataWriter zerstört wird. Diese Methode ist also keine Voraussetzung. Es hängt von Ihrem Szenario ab, wenn Sie den Stream nicht verwenden müssen, nachdem Sie DataWriter geschlossen haben, können Sie diese Methode nicht verwenden.

Wenn Sie für StreamSocket den Socket mit einem anderen Datenschreiber wiederverwenden möchten, müssen Sie den Stream vom aktuellen Writer trennen, bevor Sie ihn entsorgen. In einem gewissen Sinn, wenn ein StreamSocket Objekt das DataWriter Objekt überlebt, sollten Sie DetachStream Methode verwenden.

Nachdem wir in Thread A StoreAsync/LoadAsync aufgerufen haben, können wir WriteXXX/ReadXXX in Thread A ohne Block weiter aufrufen, ohne auf den Store/Load-Vorgang zu warten?

Ich bin mir nicht sicher, warum Sie weiterhin WriteXXX/ReadXXX aufrufen möchten, ohne auf das Laden/Laden fertig zu warten. Für die Methode StoreAsync werden Daten im Puffer an einen Sicherungsspeicher übergeben. Wir verwenden es normalerweise, wenn wir mit dem Schreiben von Daten fertig sind. Wenn wir diese Methode aufrufen, sollte es keinen anderen Aufruf der WriteXXX-Methode geben. Und für die Methode LoadAsync müssen wir warten, bis sie vollständig ist, bevor die ReadXXX-Methode aufgerufen wird, falls die Daten nicht vollständig geladen sind oder die Datenladeoperation fehlschlägt.

+0

Danke, ich habe weitere und andere Fragen zur Verwendung des I/O-Modells von Windows Runtime. Ich möchte die Diskussion auf msdn konzentrieren, können Sie mir weitere Vorschläge geben? https://social.msdn.microsoft.com/Forums/windowsapps/en-US/621ec441-3597-4a60-b2b8-8de62f0c608a/uwpcserveral-fragen-about-datawriterdatareader-and-the-associated-io-model?forum= wpdevelop und https://social.msdn.microsoft.com/Forums/windowsapps/en-US/8dcdbfcf-72e2-4d71-b26b-f40432316c5f/uwpcwhich-design-is-better-producerconsumer-with-concurrency-runtime-oder- block-wait-for-async? Forum = wpdevelop –