我想用C#删除java文件夹, 但我没有什么问题。
这是代码
private void setDebug(string value)
{
debug.Text = value;
}
private void buildButton_Click(object sender, EventArgs e)
{
// delete java folder
string java_folder = @"C:\Program Files\Java";
if (Directory.Exists(java_folder))
{
setDebug("Deleting Java folder...");
Directory.Delete(java_folder, true);
progressBar.Value += 10;
}
}
当我点击按钮时程序卡住,但是当我删除行Directory.Delete时 它将调试标签更改为“删除java文件夹...”
我知道该程序因为删除了文件夹而停滞不前,但我希望它在删除文件夹之前先更改调试。
该怎么办?谢谢你的帮助:)
答案 0 :(得分:3)
您的代码似乎无法正常工作的原因是WinForms处理UI更新的方式。
在方法buildButton_Click
完成之前,UI不会重新绘制 - 在此之前UI也不会响应。 Directory.Delete
行需要花费很长时间才能运行,因此您的程序会“粘住”并且您看不到调试标签。
您需要做的是研究使用线程 - 阅读线程,任务或BackgroundWorker类,以了解它们的工作原理。然后,不要直接在方法中调用Directory.Delete
,而是使用其中一种技术在后台线程上运行删除。
答案 1 :(得分:1)
您需要将代码包装在不同的线程中,如下所示:
private void setDebug(string value)
{
debug.Text = value;
}
private void buildButton_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
string java_folder = @"C:\Program Files\Java";
if (Directory.Exists(java_folder))
{
setDebug("Deleting Java folder...");
worker.DoWork += (s, args) => // this is the off-thread code
{
// delete java folder
Directory.Delete(java_folder, true);
};
worker.RunWorkerCompleted += (s,args)=> // this goes off when .DoWork is done
{
progressBar.Value += 10;
};
// this invokes .DoWork handler (which we defined above)
worker.RunWorkerAsync();
}
}