2011-02-10 3 views
1

Я столкнулся с несколькими сообщениями о том, что, когда вы считаете, что потоки не являются надежной структурой данных, это означает, что операции чтения/записи могут не выполняться во всех случаях.надежность потока

Итак:

а) Есть ли правда в этот консенсус?

b) Если да, то каковы случаи, когда операции чтения/записи могут завершиться неудачей?

Этот консенсус на потоки, которые я наткнулся на претензии, что вы sould цикл через операции чтения/записи до завершения:

var bytesRead = 0; 
var _packet = new byte[8192];  
while ((bytesRead += file_reader.Read(_packet, bytesRead, _packet.Length - bytesRead)) < _packet.Length) ; 
+0

Привет и добро пожаловать в переполнение стека. Если вы сталкиваетесь с сообщениями, которые говорят то или это, и ссылайтесь на них в своих вопросах, размещайте ссылки на эти сообщения, чтобы мы могли видеть полный контекст. Возможно, сообщения ошибочны, возможно, есть некоторые конкретные случаи, возможно, только неправильная формулировка. –

+0

У вас есть ссылки на сообщения, которые вы встретили? Не называть «Flush» в потоке в нужное время может привести к нежелательным эффектам в зависимости от вашего сценария, за исключением отключения питания или чего-то подобного (и потоки являются настолько же надежными, как и все остальное в таких экстремальных случаях), данные будут сброшены, если поток закрыт. –

+0

Просьба указать ссылки на сообщения, которые вы нашли. I Googled 'C# stream надежность,' и единственное сообщение, которое я нашел, было вашим. :) Я пишу код, который обрабатывает файлы размером в несколько гигабайт, используя объекты Stream без каких-либо проблем. –

ответ

2

Если следовать документации, поймать и действовать соответствующим образом, когда происходят ошибки, я думаю, что вы» ll найти потоки в значительной степени пуленепробиваемыми. Существует значительный объем кода, который вложил в эту надежность.

Можем ли мы видеть ссылки на тех, кто заявляет об обратном? Либо вы неправильно поняли, либо неверны.

+0

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

3

Ну, это зависит от того, какую операцию вы говорите, и на каком уровне вы считаете это провалом.

Например, если вы попытаетесь прочитать за конец потока (т. Е. Прочитайте 1000 байт из файла, который содержит только 100 байтов, или прочитайте 1000 байтов из позиции, которая ближе к концу файла чем 1000), вы получите меньше байтов влево. Методы чтения потока возвращают количество байт, которые они фактически могли читать, поэтому вы должны проверить это значение.

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

Если вы пишете сокеты или другие сетевые потоки, нет никакой гарантии, что даже если метод Write вернется без каких-либо исключений, что другой конец сможет его получить, существует множество проблем, которые могут пойти не так путь.

Однако, чтобы облегчить ваши проблемы, потоки сами по себе не являются ненадежными.

Среду, с которой они разговаривают, однако, может быть.

+0

спасибо, Я пытаюсь написать гнезда для рокации Сокеты блокируются, но я петлю бросаю операции отправки и получения в качестве префикса, так как u сказал, что есть множество проблем, которые могут пойти не так bytes_sent = 0; while (bytes_sent

Смежные вопросы