Реализация потоков в C # - PullRequest
2 голосов
/ 24 ноября 2011

Что мне нужно сделать, чтобы реализовать свой собственный поток, , который использует пользовательскую процедуру сжатия , аналогично, например, GZipStream?

Я, очевидно, должен создать подкласс класса Stream, но какие методы я должен реализовать, и какие методы можно оставить в их реализациях по умолчанию?

В сущности, есть специальная часть документации, , но, может быть, есть лучший и более простой вариант?

Примечания для разработчиков

При реализации производного класса Stream вы должен обеспечить реализации для методов чтения и записи. Асинхронные методы BeginRead, EndRead, BeginWrite и EndWrite являются реализуется через синхронные методы чтения и записи. Так же, ваши реализации Read и Write будут правильно работать с асинхронные методы. Реализации по умолчанию ReadByte и WriteByte создайте новый одноэлементный байтовый массив, а затем вызовите реализации чтения и записи. При выводе из Stream, если вы иметь внутренний байтовый буфер, настоятельно рекомендуется переопределите эти методы для доступа к вашему внутреннему буферу для существенно лучшая производительность. Вы также должны предоставить реализации CanRead, CanSeek, CanWrite, Flush, Length, Положение, поиск и установка длины.

Не переопределяйте метод Close, вместо этого поместите все Stream логика очистки в методе Dispose. Для получения дополнительной информации см. Реализация метода утилизации.

1 Ответ

5 голосов
/ 24 ноября 2011

Методы, которые вы должны переопределить: abstract. Он не скомпилируется, пока вы не осуществите их все. Тем не менее, вам разрешено бросить NotSupportedException, например, если вы вернете false для CanSeek, тогда Seek() разрешено бросать. Точно так же, если ваш поток доступен только для чтения (отчеты false для CanWrite), он может выдать Write.

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

...