02. oktober 2008 - 08:32Der er
8 kommentarer og 2 løsninger
Cross-thread operation not valid
Jeg har en simpel windows application hvor jeg fra en knap starter en tråd som udfører nogle beregninger. Mens tråden kører kan brugeren udfører forskellige ting på formen. Problemet opstår Når tråden er færdig og den skal skrive i en label at den er færdig. Jeg har prøvet forskellige ting men kan ikke komme udenom denne exception: "Cross-thread operation not valid: Control 'label1' accessed from a hread other than the thread it was created on."
Jeg har bla. prøvet med threads og asynchronous delegates. Hvordan kan jeg løse det?
Jeg bør nævne at tråden ikke skal returnere en værdi, da tråden gemmer resultatet i en fil. Så snart filen er updateret skal den indlæses i en label på formen. Pt er der en update knap som brugeren kan trykke på, og hvis tråden endnu ikke har updateret filen må brugeren prøve at trykke på knappen igen lidt senere, for at få updateret sin form. Men dette skulle gerne ske automatisk.
Dette er en fejl som opstår når du prøver at ændre på brugergrænsesnittet fra en anden tråd end den som ejer det. Denne fejl har de fleste vel prøvet at få :-)
Løsningen er at bruge Invoke() metoden, som ligger på alle klasser som nedarver fra Control (Forme, labels, knapper osv.). Invoke metoden skal bruge en delegate som parameter. Det Invoke gør, er at køre metoden som delegaten peger på, i brugergrænsesnittets tråd.
Først opretter du en delegate;
public delegate void InvokeDelegate();
når du skal ændre på teksten i din label, skriver du:
Hvis det bare er en lille applikation og du synes at det her invoke delegte halløj er lidt overkill kan du bare indsætte dette efter din initialize i din constructor:
ok cool, men hvad er faren ved at sætte MyFormName.CheckForIllegalCrossThread..blabla = false; Risikerer man at programmet går ned i ekstreme tildælde eller ? Jeg tænker bare der må være en grund til Cross-thread operation...exception opstår
Jepsen der er mange farer, ustabil UI, hængende program og utilsigtet problemer... Igen er det et lille program og du har styr på hvad der opdaterer UI, kan du bruge den som du vil
Du kunne også bare vælge at bruge den komponent, som er udviklet til netop at håndtere multi thread operationer for dig.
BackgroundWorker hedder den.
Når du starter en operation i den startes den asynkront (altså i en anden tråd). Har du brug for at opdatere din UI med info (tekst, status eller andet) fra din asynkrone operation, så kaldes ReportProgress. Alt hvad der udføres i reportprogress sker i den kaldende tråd, og derved har du ikke længere noget problem med multithreads operationer...
Den fungerer smukt, men har på fornemmelsen at mange glemmer den, da den måske ikke virker som den indelysende logiske løsning den i virkeligheden er når man oplever din situation første gang.
MVh. Lasse
Synes godt om
Ny brugerNybegynder
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.