-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行は実行に時間がかかるため、プログラムが「固定」され、デバッグラベルが表示されません。

あなたがする必要があるのは、スレッドの使用を調べることです-それらがどのように機能するかを理解するために、スレッド、タスク、またはBackgroundWorkerクラスを読んでください。次に、メソッドを直接呼び出す代わりにDirectory.Delete、これらの手法の1つを使用して、バックグラウンドスレッドで削除を実行します。

于 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 に答える