BackgroundWorker DoWork委托在使用XmlReader时失败
本文关键字:XmlReader 失败 DoWork BackgroundWorker | 更新日期: 2023-09-27 18:03:32
我正在尝试使用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对象直接从鼠标单击执行此操作,程序运行得很好。
任何想法?谢谢。
文档说明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
}
}
}