使用XmlReader时,BackgroundWorker DoWork委托失败

时间:2011-07-25 15:43:18

标签: c# xml backgroundworker xmlreader

我正在尝试使用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对象来执行此操作,程序运行就可以了。

有什么想法吗?感谢。

2 个答案:

答案 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
        }
    }
}