長時間実行されるプロセスを UI とは別のスレッドで実行して、ハングしないようにしBackgroundWorker
ます。たとえば、次のように使用されます。
bgWorker.RunWorkerAsync([DATA TO PROCESS])//Passing in data to operate on
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
MyObject obj = (MyObject)sender;
//
// Do some work with the data on the server
//
// Report on progess, is it done?
bgWorker.ReportProgress();
}
作業完了メソッドを持つこともできます
private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//Work is complete, notify user
}
ThreadPoolを使用することもできます。これにはもう少し設定が必要ですが、より柔軟です。例えば: -
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), [DATA TO PROCESS]);
Interlocked.Increment(ref workItems);
workItems は、処理が残っているアイテムの数です。これは、タスクが完了したかどうかを追跡するために使用できます。DoWork
次に、データを処理して workItems カウンターをデクリメントするメソッドを定義します。アイテムが処理されると、次のようなデリゲートを介して進行状況を報告します。
private delegate void ThreadDone(MyObject obj);
private delegate void TaskDone();
public void DoWork(object sender)
{
MyObject obj = (MyObject)sender;
this.Invoke(new ThreadDone(ReportProgress), result);
Interlocked.Decrement(ref workItems);
if (workItems == 0)
{
this.Invoke(new TaskDone(WorkComplete));
}
}
レポートの進行状況は次のようになります。
private void ReportProgress(MyObject obj)
{
if (workItems >= 0)
{
//Job isn't complete, report progress
}
}
private void WorkComplete()
{
}