Avatar billede Slettet bruger
15. april 2008 - 13:25 Der er 9 kommentarer

Invoke uden Form?

Hejsa.

Jeg har en klasse med nogle events som et program kan hooke sig op på. En af disse events skal affyres fra en tråd. Men hvordan invoker jeg det event kald så programmet der får eventet ikke får cross-thread ex?

f.eks:

public class MinKlasse
{
    public event DisconnectedEventHandler OnDisconnected;

    //Kører i en ny tråd
    private void CheckForDisconnect()
    {
        while(true)
        {
            if("Disconnected")
            {
                if(OnDisconnected != null)
                    OnDisconnected(this, new EventArgs());
            }
        }       
    } 

}


Det program der så bruger OnDisconnected vil få en Cross-Thread fejl. Hvordan undgår jeg dette?
Avatar billede casualty Nybegynder
15. april 2008 - 14:11 #1
Du kan ikke håndere det i din egen applikation. Cross-Thread skal implementeres seperat i den applikation der skal anvende dit library.
Avatar billede aaberg Nybegynder
15. april 2008 - 14:40 #2
Grunden til at du får en Cross thread fejl, er vel fordi dit brugergrænsesnit bliver opdateret? Den del af dit program som ændre opdatere brugergrænsesnittet har mulighed for at kalde Invoke. Du kan tjekke propertien InvokeRequired om en invoke er nødvendig.
Avatar billede aaberg Nybegynder
15. april 2008 - 14:50 #3
Du kan selvfølgelig skrive følgende kode:

Form.CheckForIllegalCrossThreadCalls = false;

Så generer cross-thread operationer ikke en fejl! Microsoft anbefaler vel ikke denne fremgangsmåde, men hvis det virker...
Avatar billede lasserasch Juniormester
15. april 2008 - 15:51 #4
Nej det vist ikke nogen speciel god løsning.

Da jeg begyndte at arbejde med tråde, mente jeg også at man da "bare" kunne gøre netop det. Men der er altså en grund til at den smide exceptions ved det... Det virker nogle gange, men langt fra altid, og du risikerer at få et ustabilt stykke slutprodukt ud af det...

Egentlig er det vel heller ikke en klasses opgave at tænke på UI relaterede exceptions.

Det bør vel altid håndteres af selve applikationen.


Mvh.
Lasse
Avatar billede neshamar1975 Nybegynder
24. april 2008 - 13:19 #5
I stedet for tråde kan du bruge "BackgroundWorker"
Avatar billede Slettet bruger
24. april 2008 - 17:40 #6
og det vil ikke køre i en anden tråd?
Avatar billede neshamar1975 Nybegynder
25. april 2008 - 19:48 #7
Der er et eksempel på backgroundworker her:
http://www.albahari.com/threading/part3.html#_BackgroundWorker
Avatar billede aaberg Nybegynder
25. april 2008 - 22:14 #8
En BackgroundWorker køre også i en annen tråd, men ProgressChanged eventet køre i hovedtråden. Så man har mulighed til at kommunikere med hovedtråden ved hjælp af dette event.

Jeg tror at neshamar1275 har ret i at en background worker vil virke!
Avatar billede neshamar1975 Nybegynder
16. maj 2008 - 21:38 #9
Har misforstået spørgsmålet lidt :S men her er et eksempel på hvordan man undgår Cross-thread fejl, håber det hjælper. Bare et lille eksempel hvor der prøves at ændre i en labels text.

public delegate void SetLabelTextDelegate(string text);
       
        public void SetLabelText ( string myString )
        {
            if(InvokeRequired)
            {
                BeginInvoke(new SetLabelTextDelegate(SetLabelText));
                return;
            }
            label1.Text = myString;
        }
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