Как я могу разделить (копируют) Поток в.NET?

Самый простой способ, которым я нашел «получить» то, что сделал for / else, и, что более важно, когда его использовать, это сконцентрироваться на том, куда переходит оператор break. Конструкция For / else представляет собой один блок. Перерыв выпрыгивает из блока и, таким образом, перепрыгивает через условие else. Если бы содержимое предложения else просто следовало за предложением for, оно никогда бы не перепрыгнуло, и поэтому эквивалентную логику нужно было бы предоставить, поместив его в if. Это было сказано ранее, но не совсем в этих словах, так что это может помочь кому-то еще. Попробуйте запустить следующий фрагмент кода. Я искренне поддерживаю комментарий «без перерыва» для ясности.

for a in range(3):
    print(a)
    if a==4: # change value to force break or not
        break
else: #no break  +10 for whoever thought of this decoration
    print('for completed OK')

print('statement after for loop')
9
задан TheSoftwareJedi 28 June 2009 в 21:53
поделиться

4 ответа

Not out of the box.

You'll need to buffer the data from the original stream in a FIFO manner, discarding only data which has been read by all "reader" streams.

I'd use:

  • A "management" object holding some sort of queue of byte[] holding the chunks to be buffered and reading additional data from the source stream if required
  • Some "reader" instances which known where and on what buffer they are reading, and which request the next chunk from the "management" and notify it when they don't use a chunk anymore, so that it may be removed from the queue
4
ответ дан 4 December 2019 в 19:35
поделиться

Это может быть сложно, не рискуя сохранить все в буфере в памяти (если потоки находятся в BOF и EOF соответственно).

Интересно, не проще ли записать поток на диск , скопируйте его и получите два потока для чтения с диска с самоудалением, встроенным в Close () (т.е. напишите свою собственную оболочку Stream вокруг FileStream ) .

3
ответ дан 4 December 2019 в 19:35
поделиться

Вы действительно не можете сделать это без дублирования хотя бы части исходного потока - в основном из-за того, что если звучит не так, как будто вы можете контролировать скорость, с которой они потребляются ( несколько потоков?). Вы могли бы сделать что-нибудь умное в отношении одного чтения за другим (и тем самым сделать копию только на этом этапе), но сложность этого звучит так, как будто это не стоит усилий.

2
ответ дан 4 December 2019 в 19:35
поделиться

I do not think you will be able to find a generic implementation to do just that. A Stream is rather abstract, you don't know where the bytes are coming from. For instance you don't know if it will support seeking; and you don't know the relative cost of operations. (The Stream might be an abstraction of reading data from a remote server, or even off a backup tape !).

If you are able to have a MemoryStream and store the contents once, you can create two separate streams using the same buffer; and they will behave as independent Streams but only use the memory once.

Otherwise, I think you are best off by creating a wrapper class that stores the bytes read from one stream, until they are also read by the second stream. That would give you the desired forward-only behaviour - but in worst case, you might risk storing all of the bytes in memory, if the second Stream is not read until the first Stream has completed reading all content.

1
ответ дан 4 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: