проблема в методе Stream.read () в c # .net - PullRequest
0 голосов
/ 16 сентября 2010
public static void ReadWholeArray (Stream stream, byte[] data)
{
    int offset=0;
    int remaining = data.Length;
    while (remaining > 0)
    {
        int read = stream.Read(data, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException(String.Format("End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
     }
}

Размер данных байтового массива равен 2682. на первой итерации цикла while значение прочитанного 1658 на следующей итерации после выполнения строки

int read = stream.Read(data, offset, remaining);

программа не отвечает

в чем проблема?

Ответы [ 3 ]

1 голос
/ 16 сентября 2010

Все, что обеспечивает ваш поток, блокируется, пока не станут доступны данные. Из документов MSDN на Stream.Read :

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

Вы можете установить тайм-аут чтения для потока, чтобы предотвратить блокировку навсегда.

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

0 голосов
/ 16 сентября 2010

Вы можете попробовать это.Этот код будет читать байты из потока в байт []:

    public static byte[] GetBytesFromStream()
    {
        FileStream fs = new FileStream("d:/pic.jpg", FileMode.Create);
        byte[] bytes = new byte[fs.Length];
        fs.Read(bytes, 0, (int)fs.Length);
        fs.Close();
        return bytes;
    }
0 голосов
/ 16 сентября 2010

Вы не установили ReadTimeout в потоке, и данных нет, поэтому вызов блокируется, пока данные не станут доступны.

Проверьте свойства Stream .ReadTimeout и .WriteTimeout.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...