28. september 2009 - 14:32Der er
6 kommentarer og 1 løsning
Cannot evaluate expression because a native frame is on top of the call stack.
Hey igen guys! Så er jeg på igen.. Denne gang får jeg fejlen
Cannot evaluate expression because a native frame is on top of the call stack.
Jeg har lavet en background worker i mit program, og den udfører lige præcis hvad den skal, men når den er færdig med hvad den skal, så crasher programmet lidt efter med fejlen
"Cannot evaluate expression because a native frame is on top of the call stack."
Jeg tror det er min background worker som bliver ved med at loope, men kan ikke finde fejlen . :)
Og benytter mig af kommandoen - System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
for at snyde mig fra fejlen
Cross-thread operation not valid: Control '<ting her>' accessed from a thread other than the thread it was created on.
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { int antal = 0; backgroundWorker.WorkerSupportsCancellation = true; if (this.backgroundWorker.CancellationPending) { e.Cancel = true; return; } List<string> md5list; string path = folderBrowse.SelectedPath;
if (this.InsertButton.Enabled == true) { Dispose(); } if (!Directory.Exists(path)) { MessageBox.Show("You must choose a valid path first"); } if (choosext.Text == "Choose extention") { MessageBox.Show("Please Choose an extention"); } else { string[] filePaths = Directory.GetFiles(path, choosext.Text, SearchOption.AllDirectories);
if (this.backgroundWorker.IsBusy) { label4.Text = "Busy"; } if (this.backgroundWorker.IsBusy == false) { label4.Text = "Not Busy"; }
//Here is where we use this method to pass back //information to the UI Thread. Notice how we //pass the current progress (limited from 0 to 100) //as well as the actual customer object.
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
class ProgressDetail { public string FileName {get;set;} public long FileCount {get;set;} public string Statustext {get;set} //Tilsæt hva' du selv har lyst til.. Eg. isBusy etc. }
// i din do_work [...] foreach (file f in files) { //process filer - og find ud af om den er en dublet. ProgressDetail d = new ProgressDetail(); d.FileName = f; d.FileCount = ++antal; d.StatusText = "Processing: " + f; d.IsDublet = isDublet; ReportProgress(calculatedPercent, d); } [...] private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e){ this.progressBar1.Value = e.ProgressPercentage; ProgressDetail pd = e.UserState as ProgressDetal; if (pd != null) { if (pd.IsDublet) { dubletGrid.Rows.Add(pd.FileName); } else { ejDubletGrid.Rows.Add(pd.FileName); } label4.Text = pd.StatusText; someOtherLabel.Text = string.Format("Processed {0} files of {0}.", pd.FileCount, totalFiles); } }
Altså - jeg manipulerer kun med kontrollerne på formen i eventhandleren for ProgressChanged. Det er fordi den bliver afviklet i samme tråd, som har oprettet kontrollerne. (det er jeg garanteret af min backgroundworker). Det er det der gør den lidt smart :)
Hvis du vil manipulere med kontrollerne i andre tråde - er du nødt til at bruge din forms Invoke(...) - og det gør det noget mere besværligt.
Det er ikke kørt gennem en compiler - og det er bedre at du prøver at læse igennem hvad koden gør. Anyway - tilføj en bool-property på denne her ProgressDetail-klasse :)
Undskyld det sene svar, men har haft travlt, men fik sat mig ned, læst det og lært det ! Super nice! Nu kører den del jo! Lav et svar og du skal modtage point! :)
Fik lært hvordan man bruger BGWorker og Klasser på noobstadie. ^^
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.