27. marts 2005 - 21:56Der er
22 kommentarer og 1 løsning
Vent på thread
Jeg har en thread som håndtere en TCP forbindelse. Denne kører i baggrunden men i en enkelt funktion i mit program, skal jeg vente på en bestemt tilstand for denne thread, før end funktionen fortsætter. Hvordan gøres dette? Funktionen må kort sagt ikke afslutte før min thread er klar til det.
Jeg ville personligt ikke have valgt ovenstående metode. Jeg ville have brugt ManuelResetEvent eller AutoRestenEvent til dette formål. Peformance er en del bedre og Monitor er mere en critcal section end det er til styring af events.
Hvis du ikke kan få det op kan jge godt lave et mini eksempel. I bund og grund har du et array med events i. Det array overfører du til hver tråd vi konstructor. I den del der venter laver du så sådan en fætter her:
WaitHandle.WaitAny(....)
Den står så og venter på på dine tråde kalder Set på eventsene. Det meget mere kostumerbar måde at lave det på, da WaitAny returnere index på det event du har rejst i tråden. Uden at vide hvad du skal tror jeg mere det her er hvad du har brug for frem for Monitor klassen.
segato : Jeg har en method som starter en thread, venter på at denne afslutter og så returnerer en status kode. Hele herligheden tager mellem 10 sekunder og helt op til nogle minutter, og bliver kun brugt et par gange i døgnet.
Hvis Mutex/Monitor ikke tager CPU kraft mens de venter, så kan det ikke have nogen indflydelse på performance - det er i øvrigt kun i forbindelse med debug at jeg bruger det, men da jeg stort set anvender threading i alt hvad jeg laver, vil jeg da meget gerne se et eksempel på ovenstående. ;o)
De andre metode er også helt fint ingen ting der. Men "min" metode er lidt mere fleksibel da man kan sende flere signaler. Jeg brøver lige at smide et lille eksempel til dig det meget nemt når man lige ser lyset. Jeg startede lige som dig men en anden gut fortalte mig den her metode som jeg så senere tog til sig. Smider et eksempel inden for 10 mins.
Ok har lavet et lille eksempel her. Det første er bare en knap i en windows app husk at inkludere namespace using System.Threading:
private void button1_Click(object sender, System.EventArgs e) { AutoResetEvent[] events = new AutoResetEvent[2]; events[0] = new AutoResetEvent(false); // Fail event. events[1] = new AutoResetEvent(false); // Succes even
ThreadClass cls = new ThreadClass(events);
Thread thread = new Thread(new ThreadStart(cls.Sleep)); thread.Start();
int index = WaitHandle.WaitAny(events); }
Tråd klassen er vist nedenunder:
using System; using System.Threading; namespace WindowsApplication2 { public class ThreadClass { AutoResetEvent[] m_events = null; public ThreadClass(AutoResetEvent[] events) { m_events = events; }
public void Sleep() { Thread.Sleep(3000); m_events[0].Set(); } } }
Hvis du debugger koden vil du se WaitHandle.WaitAny(events) gå i en vente tilstand indtil event.Set() bliver kaldt i din tråd. Og lig mærke til index som bliver returneret er det index på det event der bliver kaldt. Så man kan have en hel bunke events man kan fyre og gøre what ever med. Derudover finder der ManuelResetEvent som fungere på helt samme måde. Men når et event.Set() er kaldt skal man lige reset eventet for det aktiveres. Personligt syntes jeg det her giver mere fleksibel kode og jeg føler bdre jeg kan kontrolere hvad der sker. Men din egen måde er jo helt fin hvis det virker for lige den opgave du sidder med.
Det ser faktisk ud til at det godt kunne blive et nyttigt værktøj. Jeg bruger p.t. en state variabel, men denne kunne lige så vel blive parset gennem event, som gennem en property. Lige det jeg er igang med nu, vil det nok bare være tidsspild at skifte koden ud, men jeg kan sagtens se det smarte i ovenstående da det er lettere at styre overvågning og skift mellem synkron og asynkron afvikling på den måde.
Jeg tror i øvrigt jeg skifter min nuværende kode ud alligevel, da der skal bygges videre på det senere - og til den tid vil det være endnu mere tidsspild hvis jeg bliver nød til at skifte. ;o)
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.