(Вся) документация для свойства position
в потоке гласит:
- При переопределении в производном классе получает или устанавливает позицию в текущем потоке.
- Свойство Position не отслеживает количество байтов в потоке, которые были использованы, пропущены или обоих.
Вот и все.Итак, мы достаточно ясно понимаем, о чем это нам не говорит, но мне бы очень хотелось узнать, что на самом деле означает .Какова «позиция» для ?Почему мы хотим изменить или прочитать это?Если мы изменим это - что произойдет?
В практическом примере у меня есть поток, который периодически записывается, и у меня есть поток, который пытается читать из него (в идеале как можно скорее).После прочтения многих проблем SO я сбросил поле position
на ноль, чтобы начать чтение.Как только это будет сделано:
- Влияет ли это на то, где средство записи в этот поток попытается поместить данные?Нужно ли отслеживать последнюю позицию записи самостоятельно?(т. е. если я установлю нулевую позицию для чтения, начнёт ли писатель перезаписывать все с первого байта?)
- Если так, нужен ли мне семафор / блокировка вокруг этого поля позиции (подклассы,возможно?) из-за того, что мои два потока обращаются к нему?
- Если я не обрабатываю это свойство, писатель просто переполняет буфер?
Возможно, я не понимаюСам поток - я рассматриваю это как канал FIFO: засунуть данные с одного конца, а отсосать с другого.Если это не , как это, то нужно ли мне продолжать копировать данные после моего последнего чтения (т.е. с позиции 0x84 на) обратно в начало моего буфера?
Я серьезнопытался исследовать все это в течение достаточно долгого времени - но я новичок в .NET.Возможно, у потоков есть длинная, гордая (недокументированная) история, которую все остальные безоговорочно понимают.Но для новичка это похоже на чтение инструкции к вашему автомобилю и выяснение:
Педаль акселератора влияет на объем топлива и воздуха, подаваемого в топливные инжекторы.Это не влияет на объем развлекательной системы или давление воздуха в любой из шин, если они установлены.
Технически верно, но серьезно, что мы хотим знать, так это то, что, если мы будем растирать егона пол вы идете быстрее ..
РЕДАКТИРОВАТЬ - Увеличенное изображение
У меня есть данные, поступающие либо из последовательного порта, сокета,или файл, и в нем есть поток, ожидающий новых данных и записывающий их в один или несколько потоков - все идентичные.
Один из этих потоков, к которым я могу получить доступ из сеанса telnet с другого компьютера, и который все работаетхорошо.
Проблема, с которой я столкнулся сейчас, заключается в анализе данных в коде в той же программе (в другом из дублированных потоков).Я дублирую данные в MemoryStream, и у меня есть поток, чтобы сидеть и расшифровывать данные, и передавать его обратно в пользовательский интерфейс.Этот поток создает dataStream.BeginRead()
в своем собственном буфере, который возвращает некоторое (?) Количество данных до, но не более, чем аргумент count
.После того, как я обработал все, что получил от BeginRead
, я копирую оставшиеся данные (от конца моей точки чтения до конца потока) в начало моего буфера, чтобы он не переполнялся.
На данный момент, поскольку запись и чтение являются асинхронными, я не знаю, смогу ли я изменить позицию (так как это «курсор» - спасибо Джону).Даже если отправить сообщение в другой поток, чтобы сказать, что я только что прочитал 28 байтов или что-то еще - он не будет знать , какие 28 байтов они были, и не будет знать, как сбросить его курсор/ position
.Я не делил подклассы на подклассы - я только что создал MemoryStream и передал его потоку, который дублирует данные для любых необходимых потоков.
Все это кажется слишком сложнымчтобы быть правильным способом - я просто не могу найти простой пример, который я могу изменить по мере необходимости ..
Как еще люди справляются с долгосрочным спорадическим потоком данных, который необходимо отправить для какой-то другой задачи, которая не выполняется мгновенно?
<ч />
РЕДАКТИРОВАТЬ: вероятное решение
Пытаясь написать обертку Stream вокруг очереди из-за информации в ответах, я наткнулся на этот пост Стивена Туба.
Он написал BlockingStream
и объясняет:
Большинство потоков в .NET Framework не являются поточно-ориентированными, что означает, что несколько потоков не могут одновременно безопасно обращаться к экземпляру потока, и большинство потоков поддерживают одну позицию, в которой произойдет следующее чтение или запись. BlockingStream, с другой стороны, является потокобезопасным и, в некотором смысле, он неявно поддерживает две позиции, хотя ни одна из них не представляется как числовое значение пользователю типа.
BlockingStream поддерживает внутреннюю очередь записанных в него буферов данных. Когда данные записываются в поток, записанный буфер ставится в очередь. Когда данные считываются из потока, буфер удаляется в порядке «первым пришел - первым вышел» (FIFO), и данные в нем передаются вызывающей стороне. В этом смысле в потоке есть позиция, в которой будет выполняться следующая запись, и позиция, в которой будет происходить следующее чтение.
Кажется, точно то, что я искал - так что спасибо, ребята, отвечающие, я нашел это только из ваших ответов.