C# Snabbreferens
  • C# snabbreferens
  • Lathund: Skapa projekt
  • Lathund: koda i konsolen
  • Lathund: koda i WPF
  • Kompilering och publicering
  • Externa resurser
  • Grundläggande
    • Datatyper […]
      • String
      • Tuples
      • Enum
    • Fel
    • Typkonvertering
    • Operatorer
    • Boolska satser
    • Konsolen (Console)
    • If-satser
    • Loopar
    • Listor och arrayer
    • Slump (Random)
    • Strings
    • Metoder
    • Använda bibliotek (using)
    • Delegates, events och lambdas
    • Matematik (Math)
    • Vektorer (Numerics)
    • Datum och tid
    • Try-catch och Exception
    • Namngivning
    • Begrepp
    • Reference vs value types
    • Projektstruktur
    • Dotnet i terminalen
  • Filhantering
    • Filsökvägar
    • Läsa och skriva
    • Filer och mappar
    • Open, close, using
    • Serialisering […]
      • JSON-serialisering
      • XML-serialisering
    • Resursfiler
    • Filformat
      • JSON
  • Klasser och objektorientering
    • Översikt objektorientering
    • Lathund för klassdesign
    • Klasser och instanser
    • Struct
    • Public, private och protected
    • Klassdiagram
    • Klassmetoder
    • Konstruktorer
    • Arv
    • Komposition
    • Inkapsling och properties
    • Static
    • Polymorfism […]
      • Virtual, override
    • Generiska klasser
    • Abstract
    • Interface
    • Attribut
  • Annat
    • RayLib […]
      • Raylib setup
      • Fönster i Raylib
      • Grundläggande grafik
      • Geometriska former
      • Bilder och texturer
        • Texture
        • Image
      • Input
      • Text
      • Rectangle
      • Kollisioner
      • Kamera
      • Ljud
      • Raylib-CSharp*
    • MonoGame […]
      • Monogame-projekt*
      • MCGB Editor*
      • Input*
      • Grafik*
      • Kollisioner
      • Ljud*
    • Nätverk och internet […]
      • CRUD, HTTP och REST
      • URL:er och REST
      • RESTful client*
      • Thunder
      • RESTful server (Minimal API)
        • Swagger och OpenAPI
      • RESTful server (Web API) […]
        • Controllers
        • Models/dataklasser
        • Tester med RESTer
    • Linq
      • Linq-metoder
      • Linq-queries
    • Databaser
      • SQLite-kommandon
      • SQLite och VSCode
      • C# och SQLite
      • Entity Framework Core
    • Threading
      • Thread
      • Task
    • Pseudokod och diagram
    • Windows UI
      • WPF
      • XAML*
      • WinUI*
  • Mjukvara
    • Dotnet SDK
    • Visual Studio Code […]
      • Extensions
      • Inställningar
      • Debugging
      • Snabbkommandon
      • Snippets
      • Felsökning
    • Git & GitHub […]
      • Git-begrepp
    • Andra verktyg
  • Tekniker
    • Begränsa input
    • Game states
    • Gå igenom en array (eller lista)
    • Länkade listor och andra strukturer
    • Ta bort saker ur listan man går igenom
    • 2D-spelbräden
    • Timers
  • CONTRIBUTING
Powered by GitBook
On this page
  • Start
  • Join
  • Name
  • IsAlive
  • IsBackground
  • CurrentThread
  • Sleep

Was this helpful?

  1. Annat
  2. Threading

Thread

PreviousThreadingNextTask

Last updated 2 years ago

Was this helpful?

OBS: Ganska mycket överkurs. Det här möter man normalt först på högskola/universitet.

OBS Oftast gör man inte threading manuellt på det här viset i C#, men det är bra att förstå grundkonceptet. Istället används oftast för asynkron programmering

Thread-klassen används när man manuellt vill skapa nya trådar. Som parameter anges en metod vars kod ska köras i den separata tråden. Observera att det är metodens namn – dess identifier – som anges, och att man inte skriver () efter namnet.

using System.Threading; // Behövs för tillgång till Thread-klassen

Thread workerThread = new Thread(DoSomeHeavyLifting);

static void DoSomeHeavyLifting()
{
  // Kod som ska köras i den separata tråden
}

Man kan också använda metoder som tar emot en parameter. Parametern måste då vara av datatypen object, som sedan kan castas till sin egentliga datatyp.

Thread workerThread = new Thread(DoSomeHeavyLifting);

static void DoSomeHeavyLifting(object n)
{
  string name = (string) n;
  
  // Kod som ska köras i den separata tråden
}

Start

Startar körningen av tråden.

Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.Start();

När man startar körningen av en metod som tar emot parametrar, så anges parametervärdet som parameter i Start-metoden.

Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.Start("Saruman");

static void DoSomeHeavyLifting(object n)
{
  string name = (string) n;
  
  // Kod som ska köras i den separata tråden
}

Join

Pausar körningen av den nuvarande tråden, tills den tråd som "joinas" är klar med sin körning.

Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.Start();

// Kod som ska köras samtidigt som tråden körs

workerThread.Join();

Name

Thread workerThread = new Thread(DoSomeHeavyLifting);

workerThread.Name = "Arbetaren";

IsAlive

Thread workerThread = new Thread(DoSomeHeavyLifting);

while (workerThread.IsAlive)
{
  Console.WriteLine("Arbete pågår!");
  Thread.Sleep(500);
}

IsBackground

Skillnaden mellan bakgrundstrådar och förgrundstrådar är att om huvudprogrammet når sitt slut innan en förgrundstråd är klar, så väntar huvudprogrammet på att tråden ska bli färdig innan körningen avslutas. Bakgrundstrådar avslutas automatiskt när huvudprogrammet når sitt slut.

Trådar är normalt sett förgrundstrådar.

Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.Start();

Console.WriteLine("Väntar på att tråden ska bli klar...");
Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.IsBackground = true;
workerThread.Start();

Console.WriteLine("Väntar inte på att tråden ska bli klar...");

CurrentThread

Thread workerThread = new Thread(DoSomeHeavyLifting);
workerThread.Name = "Arbetaren";

static void DoSomeHeavyLifting()
{
  Console.WriteLine(Thread.CurrentThread.Name); // Skriver ut "Arbetaren"
  Thread.CurrentThread.IsBackground = true;
  
  // Kod som ska köras i den separata tråden
}

Sleep

En statisk metod som gör att den nuvarande tråden "somnar" (pausas) i så många millisekunder som anges som parametervärde.

static void DoSomeHeavyLifting()
{
  Console.WriteLine("Väntar 1 sekund innan resten av trådens kod körs");
  Thread.Sleep(1000);  
  
  // Kod som ska köras i den separata tråden
}

En som är trådens namn. Användbart bl.a när man debuggar.

En som berättar huruvida tråden är "levande"; alltså huruvida den just nu utför sitt arbete. Tråden börjar "leva" när den startas, och slutar leva när dess arbete är utfört – alltså när dess kod är färdigkörd.

En för huruvida tråden är en bakgrunds-tråd eller ej.

En statisk som pekar på den nuvarande tråden.

Tasks
property
property
property
property