Зачем нужен .Flush() в потоке?
От: wmlab2001  
Дата: 11.09.09 12:10
Оценка:
Разве .Close() не сбрасывает буфер перез закрытием?
В каких случаях .Flush() перед .Close() необходим?
Re: Зачем нужен .Flush() в потоке?
От: игппук Беларусь  
Дата: 11.09.09 12:57
Оценка:
Здравствуйте, wmlab2001, Вы писали:

W>Разве .Close() не сбрасывает буфер перез закрытием?

W>В каких случаях .Flush() перед .Close() необходим?

если вы по каким то причинам передумали закрывать поток. или хотите пройтись по потоку еще раз без его закрытия.
проклятый антисутенерский закон
Re: Зачем нужен .Flush() в потоке?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 11.09.09 14:07
Оценка: +1
Здравствуйте, wmlab2001, Вы писали:

W>Разве .Close() не сбрасывает буфер перез закрытием?

W>В каких случаях .Flush() перед .Close() необходим?

Flush перед Close действительно не нужен, но сам по себе Flush (без Close) весьма полезен...
[КУ] оккупировала армия.
Re[2]: Зачем нужен .Flush() в потоке?
От: _FRED_ Черногория
Дата: 13.09.09 22:03
Оценка:
Здравствуйте, koandrew, Вы писали:

W>>Разве .Close() не сбрасывает буфер перез закрытием?

W>>В каких случаях .Flush() перед .Close() необходим?

K>Flush перед Close действительно не нужен, ...


Это зависит от реализации стрима исключительно. У меня нет сейчас под рукой исходников, но подозреваю, что даже для NetworkStream будет разница. (Если вдруг окажется, что не будет, то ничто не мешает написать какую-либо реализацию, где разница таки будет).
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Зачем нужен .Flush() в потоке?
От: koandrew Канада http://thingselectronic.blogspot.ca/
Дата: 14.09.09 05:20
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Это зависит от реализации стрима исключительно. У меня нет сейчас под рукой исходников, но подозреваю, что даже для NetworkStream будет разница. (Если вдруг окажется, что не будет, то ничто не мешает написать какую-либо реализацию, где разница таки будет).


В принципе да. Но МСДН пишет следующее в комментарии к методу Stream.Dispose(bool):

You should release all resources by specifying true for disposing. When disposing is true, the stream can also ensure data is flushed to the underlying buffer, and access other finalizable objects. This may not be possible when called from a finalizer due a lack of ordering among finalizers.

If your stream is using an operating system handle to communicate with its source, consider using a subclass of SafeHandle for this purpose.

This method is called by the public Dispose method and the Finalize method. Dispose invokes the protected Dispose method with the disposing parameter set to true. Finalize invokes Dispose with disposing set to false.

Notes to Inheritors:

In derived classes, do not override the Close method, instead, put all of the Stream cleanup logic in the Dispose method.

То есть описанное мною поведение является рекомендуемым, а перекрытие метода Close — нерекомедуемым (дефолтная реализация вызывает Dispose(true)), хотя технически возможным.

В целом мой опыт свидетельстует о том, что закрытие можно явно не вызывать, хотя тот же NetworkStream имеет перегрузку Close(int32 timeout), где можно явно указать, сколько времени пытаться отправить неотправленное.
Короче, всё как всегда — на рекомендации полагайся, но документацию прочесть не забудь
[КУ] оккупировала армия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.