Google 팀에서 이전 채용 작업 흐름 시스템을 대신하여 새 채용 워크 플로 시스템을 만들고 있습니다. 이전 데이터를 새로운 스키마로 마이그레이션하는 임무가 주어졌습니다. 필자는 스키마가 근본적으로 다르고 스트레이트 TSQL 스크립트가 적절한 솔루션이 아니기 때문에 작은 Windows Forms 프로젝트를 만들어이 작업을 수행하기로 결정했습니다.Windows Forms 스레딩 및 이벤트 - ListBox 업데이트가 즉시 처리되지만 진행률 막대에 막대한 지연이 발생합니다.
작업은 다음 위임 이벤트 선언 않는 주요 봉인 클래스 'ImportController'
Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);
:
이public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;
메인 윈도우는 새로운 스레드를 사용하여 해당 클래스의 정적 메서드를 시작을 ImportProgressEvent args는 문자열 메시지, 진행률 막대의 최대 int 값 및 현재 진행 int 값을 전달합니다. 윈도우 폼 이벤트에 subcribes :
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가 매우 빠르게 업데이트되는 것처럼 보이지만 진행률 표시 줄은 배치가 거의 완료 될 때까지 결코 움직이지 않습니다 ??? 뭐라 구요?