Avatar billede bernhof Nybegynder
02. marts 2005 - 15:53 Der er 1 kommentar og
1 løsning

At vende tilbage til hovedtråden!

Jeg sidder og arbejder på at lave en klasse med noget generel funktionalitet, som skal genbruges i flere applikationer. I denne forbindelse kalder jeg en metode asynkront, og når den er færdig med at eksekvere, skal jeg raise en event, som brugeren af klassen kan benytte sig af. Men jeg støder ind i et problem undervejs:

Forløbet er således:

1. Jeg befinder mig på hovedtråden og kalder min metode asynkront (BeginXXX).
2. Min callback sub bliver kaldt og jeg kalder EndXXX. Jeg befinder mig nu på en NY tråd.
3. Jeg raiser en event med nogle bestemte parametre (returnerer resultater fra udregninger i metoden som kaldtes asynkront)
4. Brugeren af klassen har en event handler sub til denne event, og skal bl.a. opdatere brugerfladen på programmet.
5. -- PROBLEM! -- Brugeren arbejder nu også (uvidende) på den nye tråd, og vedkommende får en fejl, hvis der forsøges at refereres til kontroller på formen, som jo kører på hovedtråden.

Hvordan kan jeg undgå dette?

Mikkel
Avatar billede bernhof Nybegynder
02. marts 2005 - 15:58 #1
Bemærk: Punkt 1-3 finder sted i selve klassen, hvor punkt 4 og 5 foregår på fx en form, hvor klassen benyttes.
Avatar billede bernhof Nybegynder
10. juni 2005 - 11:27 #2
Løsning fundet.

Jeg benytter en Control, som befinder sig på hovedtråden, og kalder dens "Invoke" metode. Denne metode kan kalde en Delegate som peger på en rutine i hvilken jeg raiser min event. Metoden "Invoke" sikrer, at man vender tilbage til hovedtråden, når rutinen udføres, og derved opstår problemet med at opdatere UI ikke.
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
Kurser inden for grundlæggende programmering

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