Echipa noastră creează un nou sistem de flux de recrutare pentru a înlocui unul vechi. Am fost însărcinat cu migrarea datelor vechi în noua schemă. Am decis să fac acest lucru prin crearea unui mic proiect Windows Forms, deoarece schema este radical diferită, iar scripturile TSQL drepte nu sunt o soluție adecvată.
Clasa principală sigilată "ImportController" care face lucrarea declară următorul eveniment delegat:
public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;
Fereastra principală începe o metodă statică în acea clasă folosind un fir nou:
Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);
arborele ImportProgressEvent poartă un mesaj șir, o valoare max int pentru bara de progres și o valoare curentă int curentă. Formularul Windows subliniază evenimentul:
ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);
Și răspunde la eveniment în acest mod folosind propriul delegat:
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);
}
În cele din urmă, bara de progres și lista de casete sunt actualizate:
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;
}
}
Lucru este lista pare să se actualizeze foarte repede, dar bara de progres nu se mișcă până când lotul este aproape complet oricum ??? ce dă ?