BackgroundWorker DoWork делегат завершается ошибкой при использовании XmlReader
Я пытаюсь прочитать поток XML с помощью BackgroundWorker
:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
NetworkStream serverStream = clientSocket.GetStream();
XmlReader r = XmlReader.Create(serverStream);
while (r.Read())
{
output something using backgroundWorker1.ReportProgress object
}
}
Я называю это используя backgroundWorker1.RunWorkerAsync(null)
в событии нажатия кнопки.
Программа компилируется и работает нормально, но процесс останавливается на XmlReader.Create
, Нет ошибок, но он говорит, что не может оценить выражение, потому что собственный фрейм находится на вершине стека вызовов. Так что, вероятно, он ожидает завершения процесса.
Проблема в том, что, если я делаю это прямо с помощью мыши, без использования объекта backgroundWorker, программа работает нормально.
Есть идеи? Благодарю.
2 ответа
В документации говорится, что XmlReader.Create
читает первые несколько байтов, чтобы определить кодировку.
Я думаю, проблема в том, что ваш поток не возвращает никаких данных. Это может иметь место, потому что другой поток уже прочитал все данные.
Похоже, создание чтения XML блокируется при чтении потока.
Может возникнуть ситуация взаимоблокировки, при которой серверный поток не будет отправлять байты до тех пор, пока фоновый рабочий поток не выполнит какую-либо задачу (однако, вряд ли)
Как предполагает @Daniel Hilgarth, возможно, другой поток ранее полностью прочитал поток?
Здесь также могут быть проблемы с синхронизацией. Попробуйте добавить оператор блокировки вокруг кода, например:-
private readonly object streamLocker = new object();
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
lock(streamLocker)
{
NetworkStream serverStream = clientSocket.GetStream();
XmlReader r = XmlReader.Create(serverStream);
while (r.Read())
{
// output something using backgroundWorker1.ReportProgress object
}
}
}