【发布时间】:2013-08-29 05:55:43
【问题描述】:
我正在使用 C# 和 Winforms 制作和应用程序,将文件夹存档并保存到指定位置,对于存档文件夹,我有一个 BackgroundWorker 将文件夹路径作为输入并生成一个 zip 存档。现在在下一步需要将文件移动到指定位置,因为文件足够大并且可能会挂起 UI 线程,所以我将代码移动到另一个名为 FileMove 的 BackgroundWorker,一切正常,除了 FileMove 没有报告任何进度,这是我在归档结束后立即调用的函数;
private void FileMove_DoWork(object sender, DoWorkEventArgs e)
{
label3.Text = "Saving file,please wait...";
File.Move(temppath + @"\Output.jpg", savefilename);
}
private void FileMove_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label3.Text = "Saving file,please wait... " + e.ProgressPercentage.ToString(); //This should show Progress Percentage but it doesn't.
}
private void FileMove_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
label3.Text = ("The folder has been successfully hidden.");
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
this.ControlBox = true;
}
我面临的问题是文件移动开始后 label3 显示“正在保存文件,请稍候...”并且在很长一段时间后(因为我正在压缩 900-1000 MB )它显示“文件夹已成功隐藏。”。在 ProgressChanged 期间事件标签也应该显示百分比,但它没有。请指出或纠正我出错的地方。任何帮助将不胜感激。
【问题讨论】:
-
您是否已启用 bw 工作人员报告进度? - this
-
是的,BackgroundWorker 已启用报告进度。
-
那可能是因为你的标签在ui线程上,你需要invoke it
-
我认为您无法像使用
File.Move()所想的那样报告进度。无论您的BackgroundWorker()做什么,它都需要能够定期调用ReportProgress()msdn.microsoft.com/en-us/library/ka89zff4.aspx -
这篇文章可能会有所帮助:listener.com.ba/thepage/2011/01/22/…。作者展示了将文件移动(或在他的情况下是复制)分解成更小的块的代码,使他能够控制并在每个块之后调用
ReportProgress()。希望对您有所帮助。
标签: c# multithreading winforms file