ここでは、2つの異なる方法を実行できます。正しい方向に向けるために、両方のオプションを以下に投稿します
別のスレッドでこれを行ってから、そのスレッドから UI スレッドを更新する必要があります。UI スレッドでこの作業を実行することにより、以降の処理をブロックしています。
このコードを UI スレッドに移動できない場合は、いつでも を呼び出すことができますが、最初にこれらのオプションを検討することApplication.DoEvents
を強くお勧めします。
2番目の代替案は、次のようにすることができます:
あるスレッドから別のスレッドにデータを取得する必要があります。これにはいくつかの方法があります...
まず、「バックグラウンド」スレッドは、進行中に変化するある種の「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() を呼び出します。