我正在尝试使用BackgroundWorker
读取XML流:
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对象来执行此操作,程序运行就可以了。
有什么想法吗?感谢。
答案 0 :(得分:0)
The documentation表示XmlReader.Create
读取前几个字节以确定编码
我认为问题是,您的流不会返回任何数据。可能是这种情况,因为另一个线程已经读取了所有数据。
答案 1 :(得分:0)
听起来,读取流时,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
}
}
}