2013-05-29 116 views
2

我正在使用後臺工作來處理加載文件以阻止我的UI凍結,但看起來RunWorkerCompleted在我的DoWork事件完成之前完成(退出對話框時導致錯誤)。有什麼我做錯了嗎?我最好在任務上做這件事嗎?BackgroundWorker在DoWork之前完成

public static <T> LoadDesign(string xmlPath) 
{ 
    PleaseWait pw = new PleaseWait(xmlPath); 
    pw.ShowDialog(); 
    return pw.design; 
} 


private PleaseWait(string xmlFile) 
{ 
    InitializeComponent(); 
    bw = new BackgroundWorker(); 
    bw.WorkerSupportsCancellation = true; 
    bw.DoWork += (s, e) => 
    { 
     design = (Cast)DllCall containing XmlSerializer.Deserialize(...,xmlFile); 
    }; 
    bw.RunWorkerCompleted += (s, e) => { 
    //Exit please wait dialog 
     this.Close(); 
    }; 
    if (!bw.IsBusy) 
     bw.RunWorkerAsync(); 
} 

我認爲這個問題可能歸因於我的後臺工作人員正在調用dll而不是等待響應。我試圖加檢查,如while(design == null)無濟於事..

EDIT2 的錯誤是NRE的設計還沒有被加載,我可以很容易地解決這個問題,但更希望得到的,而不是穿線工作。

+0

如果您想要答案,請提供有關核心代碼的完整詳細信息。這個'(cast)DllCall'太僞代碼了。 –

+0

@HenkHolterman - 我已經添加了這個方法,但是我看不到它有多相關? (也正在添加'使用dll') – Sayse

+0

你看到了什麼錯誤? – YK1

回答

3

有很多小錯誤。鑑於我們可能沒有查看真實的代碼,並且我們沒有調用堆棧窗口的調試器來查看它實際崩潰的位置,其中任何一個都可能是一個因素。

  • 測試bw.IsBusy和開始時工人是真的是一個嚴重的錯誤。它不能像發佈的那樣在代碼中忙碌,但如果它真的有可能是真的,那麼你的代碼中就有一個令人討厭的bug。因爲你實際上確實訂閱繁忙工人的事件。現在RunWorkerCompleted事件處理程序將運行兩次。

  • 使用Close()方法關閉對話框不正確。對話框應該通過分配DialogResult屬性來關閉。不是最嚴重的錯誤,但錯誤。

  • 代碼中存在競爭,工作人員可以在對話框顯示之前完成。只有在創建本機窗口時才能關閉對話框。換句話說,IsHandleCreated必須是真的。你必須互相聯繫,以確保永遠不會發生。訂閱對話框的Load事件以啓動員工。

  • 你一味地認爲工人會完成工作併產生結果。當DoWork方法死於異常時不會出現這種情況。它由BackgroundWorker捕獲並作爲e.Error屬性傳遞給RunWorkerCompleted事件處理程序。你必須檢查這個屬性,並做一些合理的,如果它不爲null。

從評論來看,我猜想後一顆子彈是原因。你可以使用Debug + Exceptions來調試,勾選Thrown複選框以查看CLR異常。當拋出異常時,調試器現在會停止,從而讓您發現哪裏出了問題。

+0

謝謝你漢斯,你的確是對我的盲目是正確的假設。我會期待這個錯誤被拋出?另外,你有什麼參考,爲什麼我應該使用DialogResult?我很好奇... – Sayse

+0

當然拋出異常。並且被捕獲,所以它可以傳遞給RunWorkerCompleted事件處理程序。這是故意的設計,BGW不會那麼受歡迎,因爲它可能經常導致程序崩潰。我會推薦任何關於Winforms編程的書籍,以瞭解更多關於對話框的內容。有很多好的可用。或者只需點擊提問問題按鈕。 –

1

在顯示對話框之前,您的後臺工作人員可能不需要太多時間和完成工作。我建議將後臺工作者初始化,並啓動代碼到PleaseWait的Form_Load或Form_Shown

+1

我甚至會將它轉換爲'Shown',因爲這是顯示錶單時觸發的事件。 「載入」可能會在「顯示」之前被調用。 –

+0

是的同意你 - 同時更新我的​​答案。 – YK1

+0

我appologise YK1錯誤是不是與形式做。關閉,但我可以理解爲什麼它看起來像這樣,並感謝您的答案..我會更新問題 – Sayse

相關問題