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?
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.
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.
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!
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);
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.