Gå til innhold

Threading i VS 2005


Anbefalte innlegg

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 av moskus
Lenke til kommentar
Videoannonse
Annonse

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

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 av wolf5
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...