C# 使用XmlReader时BackgroundWorker DoWork委托失败
我正在尝试使用C# 使用XmlReader时BackgroundWorker DoWork委托失败,c#,xml,backgroundworker,xmlreader,C#,Xml,Backgroundworker,Xmlreader,我正在尝试使用BackgroundWorker读取XML流: private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { NetworkStream serverStream = clientSocket.GetStream(); XmlReader r = XmlReader.Create(serverStream);
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对象而直接通过鼠标单击来执行此操作,则程序运行正常
有什么想法吗?谢谢。声明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
}
}
}
如何通过“客户端套接字”?您是否100%确定它是相同的并且没有在bgw之外使用?您是否可以发布调用代码(关于RunWorkerAsync(null))?(在下面的注释之后)-发布与clientSocket相关的所有代码。没有它,这个问题是无法回答的。但这正是问题所在。如果我不使用backgroundWorker,它就可以正常工作。例如,如果我将该方法包含在鼠标单击事件中,它将按其应该的方式运行。要让xmlReader与backgroundWorker合作,我需要做些什么吗?@Henk:你的评论意味着你认为我没有正确阅读他的问题。你错了。请再次阅读我的回答:“可能是因为另一个线程已经读取了所有数据。”。当他在UI线程上使用代码时,很可能只有一个线程。现在他介绍了BackgroundWorker,他有两条线索。在调用BackgroundWorker之后,UI线程可以直接继续并读取网络流,这可能会导致他的问题。@Daniel:我调用xmlReader.Create的唯一位置是在BackgroundWorker中。是否仍然可能有UI线程正在读取流?如果是,我如何修复它?@snaee:请按照Henk的要求显示按钮单击处理程序的代码。这里是:private void startScan_click(object sender,EventArgs e){backgroundWorker1.RunWorkerAsync(null);}我尝试了lock语句,但没有成功。正如其他人(@Henk…)也建议的那样,backgroundWorker可能在UI流读取数据后尝试访问流。这可能是个问题,但我不知道UI线程在哪里读取数据,因为我调用XMLReader.Create的唯一位置是backgroundWorker。。。。