【发布时间】:2018-05-22 14:16:56
【问题描述】:
我必须从特定文件夹中删除文件和子文件夹,同时删除文件进度条应该显示另一个表单上的进度条。
我已经为此采取了后台工作人员。进度条值发生异常变化,但屏幕进度条未显示更新百分比。
我正在使用visual studio 2005。因为这是旧项目。
private void EmptyFolder(DirectoryInfo directoryInfo, long totalSize, frmProgress frmProgressLbl, ref long deletedSize)
{
short percent;
//long deletedSize=0;
try
{
foreach (FileInfo file in directoryInfo.GetFiles())
{
try
{
deletedSize += file.Length;
file.Delete();
percent = Convert.ToInt16((deletedSize * 100) / totalSize);
frmProgressLbl.Percent = percent;
}
catch (Exception ex)
{
}
}
foreach (DirectoryInfo subfolder in directoryInfo.GetDirectories())
{
EmptyFolder(subfolder, totalSize,frmProgressLbl,ref deletedSize);
}
}
catch (Exception ex)
{
}
}
下面是进度条所在表单上的代码。
public partial class frmProgress : Form
{
private short percent;
public short Percent { set { percent = value; } }
private BackgroundWorker bgWorker;
public frmProgress()
{
InitializeComponent();
this.bgWorker = new BackgroundWorker();
this.bgWorker.WorkerReportsProgress = true;
this.bgWorker.WorkerSupportsCancellation = true;
this.bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
this.bgWorker.RunWorkerAsync();
}
private void frmProgress_Load(object sender, EventArgs e)
{
this.label1.Text = "Deleting Files...";
this.bgWorker.RunWorkerAsync();
}
void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
this.progressBar1.Value = percent;
}
}
感谢您的帮助。
【问题讨论】:
-
不要写空的 try/catch 你永远看不到你的程序为什么会失败。
-
见:ProgressChangedEventHandler。如果您阅读了 BackgroundWorker 的 MSDN 定义,您会发现一个完整的示例代码,它与您的代码完全一样(顺便说一句,您调用了两次
RunWorkerAsync(),但是工作方法 @987654327 @, 从未被引用)。 -
您的BackgroundWorker 在DoWork 中执行完这一行之后就完成了它的工作。您必须让 BackgroundWorker 保持活动状态。
-
为自己省去很多痛苦——永远不要写
catch (Exception ex),尤其是{ }。只有当它是特定的(即不是Exception)并且只有当你能够有意义地处理它时才能捕获它。 -
@Nandu BGW 是为了在后台做工作,而不是在“后台”更新表单。您不能从另一个线程修改 UI,仅此而已。您应该将 loop 放在
DoWork中,并使用ProgressChanged事件报告进度。