Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlReader时BackgroundWorker DoWork委托失败_C#_Xml_Backgroundworker_Xmlreader - Fatal编程技术网

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。。。。