簡體   English   中英

使用XmlReader時BackgroundWorker DoWork委托失敗

[英]BackgroundWorker DoWork delegate fails when using 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對象,則程序運行正常。

有任何想法嗎? 謝謝。

該文檔指出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
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM