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.
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.