37

処理中に Windows フォーム アプリケーションのラベルを更新する最良の方法は何ですか?

ユーザーがボタンをクリックすると、ユーザーのシステム上のファイルに対して何らかの処理を行うループがあります。

foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
   // Do processing
   // Show progress bar
   // Update Label on Form, "f.Name is done processing, now processing..."
}

サンプルコードは何ですか?

これは正確には何と呼ばれていますか?それはスレッド化ですか、それともデリゲートですか?

4

5 に答える 5

70

あなたのための簡単な修正は次のようになります:

Label1.Text = f.Name + " is done processing, now processing...";
Label1.Refresh();

本当に避けたいのですがDoEvents、そうしないと、ユーザーがフォームのボタンを繰り返し押すと問題が発生します。

于 2009-02-20T17:42:13.060 に答える
14

別のスレッドでこれを実行してから、そのスレッドからUIスレッドを更新する必要があります。UIスレッドでこの作業を実行することにより、それ以上の処理をブロックしています。

このコードをUIスレッドに移動できない場合は、いつでも呼び出すことができますが、最初にこれらのオプションを検討することApplication.DoEvents強くお勧めします。

于 2009-02-20T17:38:06.427 に答える
13

あるスレッドから別のスレッドにデータを取得する必要があります。これはいくつかの方法で行うことができます...

まず、「バックグラウンド」スレッドは、進行中に変化するある種の「CurrentStatus」文字列変数を更新できます。次に、フォームにタイマーを配置して、CurrentStatus 変数を取得し、それでラベルを更新することができます。

次に、ラベル コントロールの InvokeRequired プロパティを使用して、デリゲートを使用して、バックグラウンド スレッドから UI スレッドへの操作を単純に呼び出すことができます。だから例えば…

private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
    if (this.label1.InvokeRequired)
    {
        this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
        return;
    }

    this.label1.Text = status;
}

その UpdateStatus() メソッドは任意のスレッド (UI またはバックグラウンド) から呼び出すことができ、メイン UI スレッドで操作を呼び出す必要があるかどうかを検出します (必要な場合は実行します)。

実際にスレッドを設定するには、次のようにします。

    private void StartProcessing()
    {
        System.Threading.Thread procThread = new System.Threading.Thread(this.Process);

        procThread.Start();
    }

    private void Process() // This is the actual method of the thread
    {
        foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
        {
            // Do processing
            // Show progress bar
            // Update Label on Form, "f.Name is done processing, now processing..."
            UpdateStatus("Processing " + f.Name + "...");                
        }
    }

次に、ユーザーが「GO」ボタンをクリックすると、単に StartProcessing() を呼び出します。

于 2009-02-21T15:57:37.673 に答える
1

処理に時間がかかる場合は、backgroundworkerスレッドで実行してください。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2009-02-20T17:37:31.667 に答える