2013-09-27 8 views
1

У меня есть код, который перестает работать. Он сам не изменился, но он перестает работать.MemoryStream mystery

Речь идет об использовании memystream для импорта некоторых текстовых данных извне приложения и передачи его вокруг приложения, в результате преобразования текста в строку. Следующий фрагмент кода инкапсулирует проблему:

[TestMethod] 
    public void stuff() 
    { 
     using (var ms = new MemoryStream()) 
     { 
      using (var sw = new StreamWriter(ms)) 
      { 
       sw.Write("x,y,z"); //"x,y,z" is usually a line of string data from a textfile 
       sw.Flush(); 
       stuff2(ms); 
      } 
     } 

    } 

    void stuff2(Stream ms) 
    { 
     using (var sr = new StreamReader(ms)) 
     { 
      stuff3(sr.ReadToEnd()); 
     } 

    } 

    void stuff3(string text) 
    { 
     var x = text; //when we get here, 'text' is an empty string. 
    } 

Я что-то не хватает? «текст» должен иметь первоначальное значение и мистифицировать до сегодняшнего дня всегда, что говорит о том, что то, что у меня есть, является хрупким, но что я делаю неправильно?

ТИА

+5

ли вы пытаетесь сбросить «Position» в 0 вашего потока памяти после записи в него? –

+2

Возможно, вы имели в виду «MemoryStream Misery» :-P – Steven

ответ

4

Вы забываете о текущем положении потока. После того, как вы напишете данные «x, y, z» в поток, позиция потока будет указывать на конец данных. Вам нужно переместить позицию потока для считывания данных. Нравится так:

static void stuff2(Stream ms) 
    { 
     ms.Seek(0, SeekOrigin.Begin); 
     using (var sr = new StreamReader(ms)) 
     { 
      stuff3(sr.ReadToEnd()); 
     } 

    } 
+0

Вместо поиска, вы также можете просто сказать ms.Position = 0; –

+0

Я могу видеть свою ошибку сейчас, но тайна - почему этот код работает неделями, тесты никогда не терпят неудачу, до сегодняшнего дня. Мне просто повезло? Это одно из вещей, которое по совпадению иногда срабатывает, а иногда нет, если вы опускаете линию поиска? – haughtonomous

+1

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

1

Вам необходимо «перезагрузить» ваш поток mememory. Изменить код:

[TestMethod] 
public void stuff() 
{ 
    using (var ms = new MemoryStream()) 
    { 
     using (var sw = new StreamWriter(ms)) 
     { 
      sw.Write("x,y,z"); //"x,y,z" is usually a line of string data from a textfile 
      sw.Flush(); 
      stream.Seek(0, SeekOrigin.Begin); 
      stuff2(ms); 
     } 
    } 

} 
+0

Мне нравится видеть _parent_, ответственного за сброс потока. +1 –