Поток с openWrite не пишет, пока не будет закрыт - PullRequest
1 голос
/ 21 июля 2011

У меня есть потоковая запись, которая открывается с помощью вызова WebClient.OpenWrite. Для этого упрощенного случая предположим, что читатель читает кратное из dataChunkSize.

using (Stream writer = myWebClient.OpenWrite(myURIString)
{
    using (FileStream reader = new FileStream(myFileName, FileMode.Open, FileAccess.Read)
    {
        for(int i = 0; i < reader.Length; i += dataChunkSize)
        {
            byte[] data = new byte[dataChunkSize];
            reader.Read(data, 0, dataChunkSize);
            writer.Write(data, 0, dataChunkSize);
        }

        reader.Close();
        reader.Dispose();
    }

    writer.Close();
    writer.Dispose();
}

Мои данные имеют размер 2 dataChunkSizes. Однако он не отправляет никакие данные (данные не принимаются) до тех пор, пока не будет вызван метод writer.Close (), где он отправляет только первую сумму данных dataChunkSize ... второй dataChunkSize данных никогда не отправляется.

Как я могу получить его для отправки после каждого вызова записи? Я попытался добавить writer.Flush (), но это не помогло.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 21 июля 2011

Вам нужно будет вызвать метод stream.Flush (), если вы хотите написать перед закрытием

0 голосов
/ 21 июля 2011

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

byte[] data = new byte[dataChunkSize];
int bytesRead = reader.Read(data, 0, dataChunkSize);
writer.Write(data, 0, bytesRead);
writer.Flush();
0 голосов
/ 21 июля 2011

WebClient может использовать внутренний буферный поток (сеть и т. Д.).

А про читателя. Это может читать меньше. Так что лучше используйте

    int amountRead = reader.Read(data, 0, dataChunkSize);
    writer.Write(data, 0, amountRead); 
    i += amountRead;
0 голосов
/ 21 июля 2011

Я думаю, что запись буферизована.Он не будет записывать, пока буфер не заполнится или устройство записи не будет закрыто.

...