это произошло со мной, потому что я попытался выполнить 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 );
}
Ну, можно использовать Поток. Ищите для установки положения потока. Это звучит мне как проблема, которую Вы имеете, вот то, что StreamReader читает символы, а не байты (который, в зависимости от кодирования, может отличаться, чем 1 байт за символ). От MSDN Library:
StreamReader разработан для ввода символов в конкретном кодировании, тогда как Потоковый класс разработан для ввода и вывода байта.
, Когда Вы звоните читателю. ReadToEnd (), это считывает данные в как символьная строка на основе любого кодирования, которое это использует. У Вас могла бы быть лучшая удача с помощью Поток. Читайте метод. Читайте в своих строковых данных с StreamReader и затем вытащите двоичные данные в байт [], когда Вы читали в заголовке, который уведомляет Вас относительно входящих двоичных данных.
Этот ответ запоздал и, возможно, уже не относится к вам, но он может пригодиться кому-то еще, кто столкнется с этой проблемой.
Моя проблема касалась PPM файлов, которые имеют похожий формат:
Проблема, с которой я столкнулся, заключалась в том, что класс 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();
}
}