BackgroundWorker DoWork委托在使用XmlReader时失败

本文关键字:XmlReader 失败 DoWork BackgroundWorker | 更新日期: 2023-09-27 18:03:32

我正在尝试使用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对象直接从鼠标单击执行此操作,程序运行得很好。

任何想法?谢谢。

BackgroundWorker DoWork委托在使用XmlReader时失败

文档说明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
        }
    }
}