-2

我想用 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 文件夹...”

我知道程序卡住了,因为它删除了文件夹,但我希望它在删除文件夹之前先更改调试。

该怎么办?感谢帮助 :)

4

2 回答 2

3

您的代码似乎无法正常工作的原因是 WinForms 处理 UI 更新的方式。

在您的方法完成之前,UI 不会重新绘制buildButton_Click- 直到那时 UI 也不会响应。该Directory.Delete行需要很长时间才能运行,因此您的程序“卡住”并且您看不到调试标签。

您需要做的是研究使用线程 - 阅读 Threads、Tasks 或 BackgroundWorker 类以了解它们是如何工作的。然后,不要Directory.Delete直接在您的方法中调用,而是使用其中一种技术在后台线程上运行删除。

于 2012-09-18T14:16:13.083 回答
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();
    }
}
于 2012-09-18T14:18:08.247 回答