Avatar billede Red0z Nybegynder
28. september 2009 - 14:32 Der 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);

                md5list = new List<string>();

                foreach (string file in filePaths)
                {
                    filename = System.IO.Path.GetFileName(file);
                    filedir = System.IO.Directory.GetCurrentDirectory();
                    md5string = MD5HashFromFile(file);

                    if (md5list.Contains(md5string))
                    {
                        DupGrid.Rows.Add(filename, file, md5string);
                    }
                    if (md5list.Contains(md5string) == false)
                    {
                        WriteToDoc();
                        OrgGrid.Rows.Add(filename, file, md5string);
                        md5list.Add(md5string);
                    }
                    label6.Text = Convert.ToString(antal++);

                        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.
                   
                    this.backgroundWorker.WorkerReportsProgress = false;
                    //this.backgroundWorker.ReportProgress(returnedRecordCount, filePaths);

                    System.Threading.Thread.Sleep(20);
                }
            }
        }

        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.ProgressPercentage <= this.progressBar1.Maximum)
            {
                this.progressBar1.Value = e.ProgressPercentage;
            }
        }

        public void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.InsertButton.Enabled = true;
            this.label1.Text = "Process Complete!";
        }
Avatar billede bvli Praktikant
28. september 2009 - 14:36 #1
Hej igen :)

1) Du må ikke kalde dispose på dig selv (Det er i hvert fald en rigtig rigtig dårlig ide).

2) Du må ikke tilgå nogle af dine kontroller i din baggrundstråd. Det skal du lade ReportProgress-event'et om at gøre.
Avatar billede Red0z Nybegynder
28. september 2009 - 14:43 #2
Fandt ud af det der med Disposen ihvertfald, hehe .. :P Hvordan benytter jeg det så? :) Så det hele kommer til at spille ca. ? :)
Avatar billede bvli Praktikant
28. september 2009 - 15:08 #3
Et lidt hurtigt svar:

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.
Avatar billede Red0z Nybegynder
28. september 2009 - 15:28 #4
Der er ingenting der hedder d.Dublet, hvor skal den findes, eller hvordan skal den laves? :)
Avatar billede bvli Praktikant
28. september 2009 - 15:49 #5
Uh.. Nu er det jo til inspiration jeg skrev det.

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 :)
Avatar billede Red0z Nybegynder
14. oktober 2009 - 13:10 #6
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. ^^
Avatar billede bvli Praktikant
14. oktober 2009 - 13:33 #7
He! :) Værsgo'
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester