这个让我难住了。我有一个简单的实用程序来帮助企业安装软件。一个组件备份用户当前在其机器上拥有的 AppData 文件并将它们保存到桌面上的文件夹中:
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)
{
...
}
这有效,但不会产生预期的结果。我将此操作放在后台线程上,因为每个用户备份的总文件大小可能接近一两个 GB。每次运行时,目标中的一些(但不是全部)文件和文件夹都会复制到目标,并且复制的文件夹每次都不同。有时只复制少数文件和文件夹,有时几乎所有内容都被复制,但绝不是整个目标。如果这个操作放在一个简单的控制台应用程序中,它每次都有效。关于导致它无法完成 DoWork 方法中的所有工作的 BackgroundWorker 类,我有什么需要了解的吗?
编辑:
我想我可能过于复杂了 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 没有成功,并且永远无法弄清楚为什么只复制了一些文件。感谢大家的帮助!