![](/img/trans.png)
[英]BackgroundWorker deadlock when using Control.Invoke in DoWork together with ShowDialog
[英]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.