這一個讓我難住。我有一個簡單的實用工具,可以幫助企業安裝軟件。單組分備份應用程序數據文件的用戶目前擁有自己的計算機上,並將它們保存到桌面上的文件夾:C#BackgroundWorker_DoWork只做一些工作
private void backupButton_Click(object sender, EventArgs e)
{
backgroundBackup.RunWorkerAsync();
}
private void backgroundBackup_DoWork(object sender, DoWorkEventArgs e)
{
...
}
private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
...
}
// I removed the message boxes from DoWork, and added a RunWorkerCompleted event,
// but neither the confirmation nor the error messgae box from RunWorkerCompleted are shown.
private void backgroundBackup_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
...
}
這工作,但不會產生預期的結果。我把這個操作放在後臺線程上,因爲每個用戶備份的文件總大小可能接近1或2個。每次運行時,目標中的一些(但不是全部)文件和文件夾將被複制到目標,並且每次都複製所複製的文件夾。有時候只有很少的文件和文件夾被複制,有時幾乎所有的東西都被複制,但從來不是整個目標。如果將此操作放置在簡單的控制檯應用程序中,則它每次都有效。有什麼我需要了解的BackgroundWorker類,導致它不執行DoWork方法中的所有工作?
編輯:
我想我可能是在此問題上與BackgroundWorker的類複雜。我跟一個同事,和他們建議創建一個新線程的一種簡單的方法來處理潛在的漫長的過程:
private void backupButton_Click(object sender, EventArgs e)
{
Thread backupThread = new Thread(backupThreadJob);
backupThread.Start();
}
private void backupThreadJob()
{
try
{
//copy files and stuff
}
catch(Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
這得到對我所做的工作;我嘗試使用BackgroundWorker時沒有成功,並且始終無法弄清爲什麼只有一些文件被複制。感謝大家的幫助!
我猜想一些異常正在提出,但是你的消息框不顯示,因爲你是從後臺線程調用而不是主UI線程。您可能應該在UI線程上調用這些方法。 –
我期望你有一個異常,並且消息框沒有顯示,因爲它不是UI線程。嘗試記錄異常,而且通常不會消耗所有異常。它使調試噩夢,因爲你現在可能已經意識到 –
你有沒有看過你的catch塊中的MessageBox?嘗試在後臺線程中拋出一個硬編碼的異常來查看是否顯示消息框。我的猜測是你的過程拋出錯誤。 –