Реализация с использованием C ++ / CX.
В примере DataReaderWriter говорится, что мы должны отсоединиться () до того, как объект DataWriter умрет, чтобы предотвратить закрытие потока. Но в других примерах кодов DataWriter / DataReader я не нашел больше доказательств того, что это требование, и в документах не упоминается ничего более подробного. Мой вопрос, когда мы должны detachStream ()? Например, если объект StreamSocket переживает объект DataWriter, нужно ли мне detachStream ()?
Или это требуется только в том случае, если нет других ссылок, содержащих жизнь базового объекта потока?
И еще один вопрос о DataWriter / DataReader:
После того, как мы вызовем StoreAsync / LoadAsync в потоке A, можем ли мы продолжить вызов WriteXXX / ReadXXX в потоке A без блокировки, ожидающей завершения сохранения / загрузки?
Мой вопрос, когда мы должны detachStream ()?
Как Комментарии в примере DataReaderWriter сказано:
Чтобы продлить срок службы потока, отсоедините его от DataWriter, чтобы он не закрывался при разрушении dataWriter. Если мы не сможем отсоединить поток, деструктор dataWriter закроет основной поток, предотвращая его последующее использование DataReader ниже.
DetachStream
метод используется здесь, потому что основной поток должен быть использован последующим DataReader
, Если мы не отсоединим его от DataWriter
, он будет закрыт, когда dataWriter
разрушен. Так что этот метод не является обязательным. Это зависит от вашего сценария, если вам не нужно использовать поток после закрытия DataWriter
Вы не можете использовать этот метод.
Для StreamSocket, если вы хотите повторно использовать сокет с другим устройством записи данных, вы должны отсоединить поток от текущего устройства записи перед его удалением. Так что в некотором смысле, если StreamSocket
объект пережить DataWriter
объект, вы должны использовать DetachStream
метод.
После того, как мы вызовем StoreAsync / LoadAsync в потоке A, можем ли мы продолжить вызов WriteXXX / ReadXXX в потоке A без блокировки, ожидающей завершения сохранения / загрузки?
Я не уверен, почему вы хотите продолжать вызывать WriteXXX / ReadXXX, не дожидаясь завершения сохранения / загрузки. За StoreAsync
метод, он передает данные в буфере в резервное хранилище. Обычно мы используем его, когда заканчиваем писать данные. Поэтому, когда мы вызываем этот метод, другого вызова метода WriteXXX не должно быть. И для LoadAsync
метод, нам нужно дождаться его завершения, прежде чем вызывать метод ReadXXX, если данные загружены не полностью или операция загрузки данных завершается неудачно.
Других решений пока нет …