Moskus Skrevet 24. oktober 2006 Del Skrevet 24. oktober 2006 (endret) Er det bare meg, eller var det enklere å jobbe med en thread i VS 2003? Før kunne jeg gjøre slik (tror jeg iallfall at jeg gjorde): Dim threadTimer As Threading.Thread Private Sub fmrMain_Load()... threadTimer = New Threading.Thread(AddressOf ThreadTasks) threadTimer.Priority = Threading.ThreadPriority.Lowest threadTimer.Start() End Sub Private Sub btnPause()... threadTimer.Suspend End Sub Private Sub btnPause()... threadTimer.Resume End Sub ... men det er selvfølgelig ikke mulig å gjøre lenger. VS 2005 meddeler at: Warning 1 'Public Sub Suspend()' is obsolete: 'Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202' (linken hos microsoft leder ingensteds hen) Vel, etter noen studier (jeg er tydeligvis ikke flink å lete på MSDN), så har jeg kommet frem til at det skal være mulig å bruke threadTimer.Sleep(infinite) og threadTimer.Interrupt. Interrupt får jeg lov til, men Sleep(inf) er det verre med og VS foreslår å bytte ut threadTimer.Sleep() med Threading.Thread.Sleep(inf) som absolutt ikke er det jeg er ute etter, så vidt jeg kan forstå... Er det virkelig så vanskelig å styre en tråd fra en annen tråd? Hva er det jeg misforstår? Endret 24. oktober 2006 av moskus Lenke til kommentar
wolf5 Skrevet 24. oktober 2006 Del Skrevet 24. oktober 2006 Threading er så definitivt gjort mer vanskelig i .Net 2005 enn det var i .2003. Du kan jo prøve å leke deg med threading ifm Forms om du gjorde det i .Net 2003. Årsaken er nok trådsikkerhet og ustabilitet. Tror rett og slett du må tenke på nytt når du tar over eksisterende .Net 2003 trådkode til 2005. Det er mye forskjell. Antar du har en hovedløkke i ThreadTasks siden tråden ikke dør etter endt oppgave, så strengt tatt trenger du bare en bool som du kan styre. Noe ala dette: static void Main() { Thread t = new Thread(new ThreadStart(ThreadTasks)); bPause = true; t.Start(); Application.Run(); } static bool bPause = false; static void ThreadTasks() { //Evig loop som holder tråden i live while (true) { //Utfør hva enn tråden skal gjøre Debug.WriteLine("Tasktime"); Thread.Sleep(1000); //Sjekk om tråden skal sovne while (bPause) { Thread.Sleep(1000); //Sjekker hvert sekund om tråden skal våkne igjen } } } Lenke til kommentar
Moskus Skrevet 24. oktober 2006 Forfatter Del Skrevet 24. oktober 2006 (endret) Det fungerer jo det, men det burde jo være enklere (eller bedre) måter å gjøre det på... Men takk uansett! Endret 24. oktober 2006 av moskus Lenke til kommentar
wolf5 Skrevet 24. oktober 2006 Del Skrevet 24. oktober 2006 (endret) Ellers mener jeg BackgroundWorker klassen ble introdusert i 2005. Denne er ypperlig for alt som har med enkel trådbehandling å gjøre. Anbefaler deg å ta en titt på denne. Denne har mange bruksmuligheter. Eksempel static void MinFunksjon() { BackgroundWorker bgw = new BackgroundWorker(); bgw.DoWork += new DoWorkEventHandler(bgw_DoWork); bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted); bgw.RunWorkerAsync("test"); } static void bgw_DoWork(object sender, DoWorkEventArgs e) { //Gjør noe (dette er en egen tråd) string parameter = (string)e.Argument; Debug.WriteLine("Gjør bakgrunnsarbeid: " + parameter); e.Result = "alt ok"; } static void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { string status = (string)e.Result; Debug.WriteLine("Status:" + status); } DoWork kjøres i en egen tråd, mens RunWorkerCompleted kjøres på original-tråden som startet backgroundworkern. Dette er veldig greit når du ønsker å kalle noe i bakgrunnen på en form og vise det. Visningen gjør du da under RunWorkerCompleted da man ikke lengre har lov å aksessere Formen på en annen tråd enn den formen kjører på. Alternativt kan du kjøre mycontrol.Invoke() fra en annen tråd (DoWork f.eks). Endret 24. oktober 2006 av wolf5 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå