あるスレッドから別のスレッドにデータを取得する必要があります。これはいくつかの方法で行うことができます...
まず、「バックグラウンド」スレッドは、進行中に変化するある種の「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() を呼び出します。