Vra

Ons span is die skep van 'n nuwe werwing workflow stelsel om 'n ou een te vervang. Ek is getaak met migreer die ou data in die nuwe skema. Ek het besluit om dit te doen deur die skep van 'n klein Windows Vorms projek as die skema is radikaal anders en reguit TSQL skrifte is nie 'n voldoende oplossing.

Die belangrikste verseël klas 'ImportController' dat die werk nie verklaar die volgende afgevaardigde gebeurtenis:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

Die hoof venster begin 'n statiese metode in daardie klas met behulp van 'n nuwe draad:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

die ImportProgressEvent args dra 'n string boodskap, 'n maksimum int waarde vir die progress bar en 'n huidige vordering int waarde. Die Windows vorm subcribes om die gebeurtenis:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

En reageer op die gebeurtenis op hierdie wyse met behulp van sy eie afgevaardigde:

    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);
            }

Ten slotte die progress bar en listbox is opgedateer op:

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;
            }
        }

Die ding is die ListBox lyk baie vinnig op te dateer, maar die vordering bar nooit beweeg totdat die joernaal is byna voltooi in elk geval ??? wat gee?

Was dit nuttig?

Oplossing 4

@John

Dankie vir die skakels.

@Will

Daar is geen wins uit threadpooling as ek weet dit sal altyd net een draad kuit. Die gebruik van 'n draad is bloot om 'n responsiewe UI het terwyl SQL Server word gehamer met lees en skryf. Dit is beslis nie 'n korte duur draad.

Met betrekking tot slee-hamers jy is reg. Maar, as dit blyk my probleem was tussen die skerm en stoel na alles. Dit lyk asof ek 'n unusal joernaal van data wat baie baie baie meer vreemde sleutel rekords het as die ander groepe het en net gebeur om vroeg in die proses wat beteken dat die currentProgress nie kry ++ 'd vir 'n goeie 10 sekondes kry gekies.

@All

Dankie vir al jou insette, dit het my laat dink, wat het my elders soek in die kode, wat gelei het tot my GHGG oomblik van nederigheid waar ek nog bewys weer die fout is gewoonlik menslike:)

Ander wenke

Miskien kan jy die Background komponent probeer. Dit maak threading makliker. Voorbeelde hier:

Miskien buite die omvang, maar om soms sy nuttig om 'n Application.DoEvents(); te maak die gui dele reageer op die gebruiker se toevoer, soos die druk op die kanselleer-knoppie op 'n dialoog status bar doen.

Het jy deur 'n kans te hardloop Windows Vista? Ek het die presies dieselfde ding in 'n werk-verwante aansoeke opgemerk. Een of ander manier, daar blyk 'n vertraging wees wanneer die progress bar "animasie".

Is jy seker dat die UI draad vrylik loop tydens al hierdie proses? dit wil sê dit is nie geblokkeer-up sit op 'n lid van of 'n ander wag? Dis hoe dit lyk vir my.

Die voorstel van die gebruik van Background is 'n goeie een -. Definitief beter as probeer om hamer jou pad uit die probleem met 'n vrag van Refresh / Update oproepe

En Background sal 'n swembad draad, wat is 'n vriendeliker manier om op te tree as die skep van jou eie kortstondige draad gebruik.

  

Daar is geen wins uit threadpooling as   Ek weet dit sal net ooit kuit een   draad. Die gebruik van 'n draad is suiwer   om 'n responsiewe UI terwyl SQL hê   Bediener word gehamer met lees en   skryf. Dit is beslis nie 'n kort   geleef draad.

OK, ek waardeer dit, en bly jy het jou fout, maar het jy al gekyk na Background? Dit doen pretty much presies wat jy doen nie, maar in 'n gestandaardiseerde mode (dit wil sê sonder jou eie afgevaardigdes) en sonder die behoefte om 'n nuwe draad te skep -. Wat albei (miskien klein, maar miskien nog nuttig) voordele

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top