Освободивший буфер StreamReader

это произошло со мной, потому что я попытался выполнить access UI компонент в another thread insted of UI thread

, как этот

private void button_Click(object sender, RoutedEventArgs e)
{
    new Thread(SyncProcces).Start();
}

private void SyncProcces()
{
    string val1 = null, val2 = null;
    //here is the problem 
    val1 = textBox1.Text;//access UI in another thread
    val2 = textBox2.Text;//access UI in another thread
    localStore = new LocalStore(val1);
    remoteStore = new RemoteStore(val2);
}

, чтобы решить эту проблему, обернуть любой вызов ui внутри , о чем упоминал Кандид в своем ответе

private void SyncProcces()
{
    string val1 = null, val2 = null;
    this.Dispatcher.Invoke((Action)(() =>
    {//this refer to form in WPF application 
        val1 = textBox.Text;
        val2 = textBox_Copy.Text;
    }));
    localStore = new LocalStore(val1);
    remoteStore = new RemoteStore(val2 );
}

18
задан Matt Burke 6 February 2009 в 17:35
поделиться

2 ответа

Ну, можно использовать Поток. Ищите для установки положения потока. Это звучит мне как проблема, которую Вы имеете, вот то, что StreamReader читает символы, а не байты (который, в зависимости от кодирования, может отличаться, чем 1 байт за символ). От MSDN Library:

StreamReader разработан для ввода символов в конкретном кодировании, тогда как Потоковый класс разработан для ввода и вывода байта.

, Когда Вы звоните читателю. ReadToEnd (), это считывает данные в как символьная строка на основе любого кодирования, которое это использует. У Вас могла бы быть лучшая удача с помощью Поток. Читайте метод. Читайте в своих строковых данных с StreamReader и затем вытащите двоичные данные в байт [], когда Вы читали в заголовке, который уведомляет Вас относительно входящих двоичных данных.

0
ответ дан 30 November 2019 в 05:20
поделиться

Этот ответ запоздал и, возможно, уже не относится к вам, но он может пригодиться кому-то еще, кто столкнется с этой проблемой.

Моя проблема касалась PPM файлов, которые имеют похожий формат:

  • ASCII текст в начале
  • Бинарные байты для остальной части файла

Проблема, с которой я столкнулся, заключалась в том, что класс StreamReader не способен читать материал по одному байту за раз без буферизации. Это приводило к неожиданным результатам в некоторых случаях, поскольку метод Read() читает один символ, а не один байт.

Моим решением было написать обертку вокруг потока, которая бы считывала байты по одному за раз. Обертка имеет 2 важных метода, ReadLine() и Read().

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

class UnbufferedStreamReader: TextReader
{
    Stream s;

    public UnbufferedStreamReader(string path)
    {
        s = new FileStream(path, FileMode.Open);
    }

    public UnbufferedStreamReader(Stream stream)
    {
        s = stream;
    }

    // This method assumes lines end with a line feed.
    // You may need to modify this method if your stream
    // follows the Windows convention of \r\n or some other 
    // convention that isn't just \n
    public override string ReadLine()
    {
        List<byte> bytes = new List<byte>();
        int current;
        while ((current = Read()) != -1 && current != (int)'\n')
        {
            byte b = (byte)current;
            bytes.Add(b);
        }
        return Encoding.ASCII.GetString(bytes.ToArray());
    }

    // Read works differently than the `Read()` method of a 
    // TextReader. It reads the next BYTE rather than the next character
    public override int Read()
    {
        return s.ReadByte();
    }

    public override void Close()
    {
        s.Close();
    }
    protected override void Dispose(bool disposing)
    {
        s.Dispose();
    }

    public override int Peek()
    {
        throw new NotImplementedException();
    }

    public override int Read(char[] buffer, int index, int count)
    {
        throw new NotImplementedException();
    }

    public override int ReadBlock(char[] buffer, int index, int count)
    {
        throw new NotImplementedException();
    }       

    public override string ReadToEnd()
    {
        throw new NotImplementedException();
    }
}
8
ответ дан 30 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: