指定されたコードによると、while(true)
永遠に実行されます。時間のかかるプロセスがある場合は、別のスレッドを使用してそれを処理する必要があります。その時間のかかるプロセスをメイン スレッド (UI スレッド) で実行すると、メイン スレッド (UI スレッド) がビジーになり、そのタスクが完了するまで UI 変更要求が考慮されません。そのため、UI がフリーズします。
時間のかかるタスクに backgroundWorker を使用すると、目的を達成できます。BackgroundWorkder.DoWorkメソッドのwhile(true)
句にロジックを実装する必要があります。
BackgroundWorker に関するいくつかのポイント...
別のスレッドで作業を行い、メイン スレッドに進行状況を報告し、非同期プロセスをキャンセルすることは、BackgroundWorker で最も重要な機能です。以下の例は、これら 3 つの機能を非常に明確に示しています。ウェブ上で利用可能な例が山ほどあります。
using System;
using System.Threading;
using System.ComponentModel;
class Program
{
static BackgroundWorker _bw;
static void Main()
{
_bw = new BackgroundWorker
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
_bw.DoWork += bw_DoWork;
_bw.ProgressChanged += bw_ProgressChanged;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
_bw.RunWorkerAsync ("Hello to worker");
Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
Console.ReadLine();
if (_bw.IsBusy) _bw.CancelAsync();
Console.ReadLine();
}
static void bw_DoWork (object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i += 20)
{
if (_bw.CancellationPending) { e.Cancel = true; return; }
_bw.ReportProgress (i);
Thread.Sleep (1000); // Just for the demo... don't go sleeping
} // for real in pooled threads!
e.Result = 123; // This gets passed to RunWorkerCompleted
}
static void bw_RunWorkerCompleted (object sender,
RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
Console.WriteLine ("You canceled!");
else if (e.Error != null)
Console.WriteLine ("Worker exception: " + e.Error.ToString());
else
Console.WriteLine ("Complete: " + e.Result); // from DoWork
}
static void bw_ProgressChanged (object sender,
ProgressChangedEventArgs e)
{
Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
}
}
詳しくはこちらをご覧ください。