私たちのチームは、古いものに代わる新しい採用ワークフロー システムを作成しています。私は、古いデータを新しいスキーマに移行する任務を負っています。スキーマが根本的に異なり、単純な TSQL スクリプトは適切なソリューションではないため、小規模な Windows フォーム プロジェクトを作成することでこれを行うことにしました。
作業を行うメインのシール クラス 'ImportController' は、次のデリゲート イベントを宣言します。
public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;
メイン ウィンドウは、新しいスレッドを使用してそのクラスの静的メソッドを開始します。
Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);
ImportProgressEvent 引数は、文字列メッセージ、進行状況バーの最大 int 値、および現在の進行状況 int 値を運びます。Windows フォームはイベントにサブスクライブします。
ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);
独自のデリゲートを使用して、この方法でイベントに応答します。
private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);
private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
{
this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
}
最後に、プログレス バーとリストボックスが更新されます。
private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
{
string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in items)
{
this.lstTasks.Items.Add(item);
}
if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
{
this.ImportProgressBar.Maximum = progressMax;
this.ImportProgressBar.Value = currentProgress;
}
}
問題は、ListBox が非常に迅速に更新されるように見えることですが、とにかくバッチがほぼ完了するまでプログレス バーは移動しませんか ??? 何が得られますか?