Avatar billede sollie Nybegynder
23. marts 2007 - 13:07 Der er 7 kommentarer og
1 løsning

bryd Thread.sleep() eller alternativ løsning

Jeg er igang med at lave en flere tråde applikation.
I denne applikation skal nogle af trådende så og sige holde en pause på en bestemt tidsmængde, da de skal overvåge nogle netværks enheder. Jeg bruger Thread.sleep() til at holde denne pause, men hvis jeg vil have at applikationen skal stoppe og en tråd sidder i en Thread.sleep() skal jeg vente på at den kommer ud af det før at den reagere.
Nogen der ved hvordan jeg kan få den ud af dette eller har en alternativ løsning til Thread.sleep() som jeg kan bruge hvor jeg stadigvæk kan holde en pause i en bestemt tids periode?
Avatar billede bitmatic Nybegynder
23. marts 2007 - 13:59 #1
Du kan jo altid kalde Thread.Abort() på tråden - Så skal den nok dø :)

Og bare for lige at få det helt på det rene... Sleep() holder ikke pause i et bestemt tidsrum. Med Sleep() fortæller du operativsystemet, at du ikke vil allokeres tid igen før et vist tidsrum er passeret. Når det tidsrum har passeret kan systemet så vælge om den vil give dig lidt processortid, men det er ikke sikkert at du får det med det samme (eller nogensinde).
Med andre ord - Sleep(x) holder pause i MINDST x milisekunder.

Ellers findes der et par alternativer til at bruge Thread.Sleep(). Til dit brug vil det sikkert være bedre at bruge en synkroniserings-semafor, eller suspend-resume.

Du kan læse mere her: http://www.csharphelp.com/archives2/archive417.html

/Jakob
Avatar billede sollie Nybegynder
23. marts 2007 - 14:44 #2
Det viste jeg godt.
Og problemet er når jeg bruger sleep og så kalder abort() så udføre tråden først koden til abort kaldet når at den er ude af Sleep(). Deri er mit problem. Og angående suspend og resume så skal jeg aligevel have en tråd til at overvære den tid som den første tråd skal være suspendet i og der kan jeg igen kun se Sleep() som en løsning og så kommer samme problem igen.
Ved du hvordan man kan stille noget op så man ikke er afhængig af Sleep() og derved kunne kalde og udføre abort() når det bliver kaldt?
Avatar billede bitmatic Nybegynder
23. marts 2007 - 15:52 #3
ja da :)

i stedet for at have en konstruktion som:

while(true)
{
  //DoSomething

  Thread.Sleep(x);
}

Så lav en konstruktion lignende:

while(true)
{
  //DoSomething

  Thread.Suspend();
}

og så sæt en timer til at resume tråden med jævne mellemrum. Det bliver formodentlig også lidt mere nøjagtig i timingen hvis du gør det....

Hvis du så vil dræbe tråden kan du jo bare sige:

Thread.Abort();
Thread.Resume();

Fra der hvor du vil dræbe tråden.

/Jakob
Avatar billede bitmatic Nybegynder
23. marts 2007 - 16:31 #4
Jeg forstår i øvrigt ikke hvorfor du siger at abort ikke udføres med det samme... Hvilken version af .NET kører du med ?

Jeg har lavet et lille testprogram, der gør noget lignende af det jeg tror du vil. Det bruger Thread.Abort og i mit program dræbes tråden med det samme.

Det er et lille .NET 2.0 konsol program


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ThreadAbortTest
{
    class Program
    {
        static void Main(string[] args)
        {
            ThreadStart threadDelegate = new ThreadStart(Worker);
            Thread newThread = new Thread(threadDelegate);
            newThread.Name = "Worker";
            newThread.Start();

            Thread.Sleep(1000);

            newThread.Abort();

            Thread.Sleep(1000);
        }

        static void Worker()
        {
            while(true)
            {
                Console.WriteLine("mjello...");

                Thread.Sleep(60000);
            }
        }
    }
}
Avatar billede sollie Nybegynder
25. marts 2007 - 12:37 #5
Jeg køre med version 2.
Hvis du ligger et svar kan du få dine points. :-)
Avatar billede bitmatic Nybegynder
25. marts 2007 - 22:08 #6
ok
Avatar billede md_craig Nybegynder
27. marts 2007 - 14:03 #7
For at udvide bitmatic's eksempel lidt, så kan du vælge at fange din abort exception... det er ganske nytigt lige at vide... samtidig kan man bruge interrupt til at sætte den igang igen midt i en sleep state...

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace ThreadAbortTest
{
  class Program
  {
    static void Main(string[] args)
    {
      Thread newThread = new Thread( new ThreadStart( Worker ) );
      newThread.Name = "Worker";
      newThread.Start();

      for ( int i = 0; i < 10; i++ )
      {
        Thread.Sleep( 2000 );
        newThread.Interrupt();
      }
      newThread.Abort();
    }

    static void Worker()
    {
      while ( true )
      {
        Console.WriteLine( "mjello..." );
        try
        {
          Thread.Sleep( 120000 );
        }
        catch ( ThreadInterruptedException ex )
        {
          Console.WriteLine( "Tråden var interupted og fortsætter" );
        }
        catch ( ThreadAbortException ex )
        {
          Console.WriteLine( "Tråden var arbortet og afslutter" );
          break;
        }
      }
    }
  }
}

Kunne jo være det kom in handy... så ville lige smide det på...

Det med at kører en try catch på abort kan være meget nytigt i det tilfælde at du har noget der skal "rydes op"... kunne være lukke nogle porte, disconnecte eller lign...
Avatar billede bitmatic Nybegynder
27. marts 2007 - 22:44 #8
Det er sgu smart det der.... tak.
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