Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> C Taal

C# - Multithreading

Een draad wordt gedefinieerd als het uitvoeringspad van een programma. Elke thread definieert een unieke stroom van controle. Als uw toepassing ingewikkelde en tijdrovende bewerkingen met zich meebrengt, is het vaak handig om verschillende uitvoeringspaden of threads in te stellen, waarbij elke thread een bepaalde taak uitvoert.

Discussies zijn lichtgewicht processen . Een veelvoorkomend voorbeeld van het gebruik van thread is de implementatie van gelijktijdige programmering door moderne besturingssystemen. Het gebruik van threads bespaart verspilling van CPU-cyclus en verhoogt de efficiëntie van een applicatie.

Tot nu toe hebben we de programma's geschreven waarin een enkele thread wordt uitgevoerd als een enkel proces dat de actieve instantie van de toepassing is. Op deze manier kan de toepassing echter één taak tegelijk uitvoeren. Om het meer dan één taak tegelijk te laten uitvoeren, kan het worden opgedeeld in kleinere threads.

Levenscyclus van threads

De levenscyclus van een thread begint wanneer een object van de klasse System.Threading.Thread wordt gemaakt en eindigt wanneer de thread wordt beëindigd of de uitvoering voltooit.

Hieronder volgen de verschillende toestanden in de levenscyclus van een thread −

  • De niet-gestarte staat − Het is de situatie waarin de instantie van de thread wordt gemaakt maar de Start-methode niet wordt aangeroepen.

  • De gereedstatus − Het is de situatie waarin de thread klaar is om te draaien en de CPU-cyclus wacht.

  • De niet-uitvoerbare staat − Een thread is niet uitvoerbaar, wanneer

    • Slaapmethode is aangeroepen
    • Wachtmethode is aangeroepen
    • Geblokkeerd door I/O-bewerkingen
  • De Dode Staat − Het is de situatie waarin de thread de uitvoering voltooit of wordt afgebroken.

De rode draad

In C# is de System.Threading.Thread class wordt gebruikt voor het werken met threads. Hiermee kunt u afzonderlijke threads maken en openen in een toepassing met meerdere threads. De eerste thread die in een proces moet worden uitgevoerd, wordt de main . genoemd draad.

Wanneer een C#-programma wordt uitgevoerd, wordt automatisch de hoofdthread gemaakt. De threads die zijn gemaakt met de Thread class worden de onderliggende threads van de hoofdthread genoemd. U kunt een thread openen met de CurrentThread eigenschap van de Thread-klasse.

Het volgende programma demonstreert de uitvoering van de hoofdthread −

Live demo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class MainThreadProgram {
      static void Main(string[] args) {
         Thread th = Thread.CurrentThread;
         th.Name = "MainThread";
         
         Console.WriteLine("This is {0}", th.Name);
         Console.ReadKey();
      }
   }
}

Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −

This is MainThread

Eigenschappen en methoden van de Thread-klasse

De volgende tabel toont enkele meest gebruikte eigenschappen van de Thread klasse −

Sr.nr. Eigendom en beschrijving
1

CurrentContext

Haalt de huidige context op waarin de thread wordt uitgevoerd.

2

HuidigeCultuur

Haalt of stelt de cultuur in voor de huidige thread.

3

Huidig ​​principe

Haalt of stelt de huidige principal van de thread in (voor op rollen gebaseerde beveiliging).

4

CurrentThread

Haalt de huidige thread op.

5

HuidigeUICulture

Haalt of stelt de huidige cultuur in die door de Resource Manager wordt gebruikt om cultuurspecifieke bronnen tijdens runtime op te zoeken.

6

ExecutionContext

Haalt een ExecutionContext-object op dat informatie bevat over de verschillende contexten van de huidige thread.

7

IsAlive

Krijgt een waarde die de uitvoeringsstatus van de huidige thread aangeeft.

8

IsBackground

Haalt of stelt een waarde in die aangeeft of een thread al dan niet een achtergrondthread is.

9

IsThreadPoolThread

Krijgt een waarde die aangeeft of een thread al dan niet tot de beheerde threadpool behoort.

10

ManagedThreadId

Krijgt een unieke identificatie voor de huidige beheerde thread.

11

Naam

Haalt of stelt de naam van de thread in.

12

Prioriteit

Haalt of stelt een waarde in die de planningsprioriteit van een thread aangeeft.

13

ThreadState

Krijgt een waarde die de toestanden van de huidige thread bevat.

De volgende tabel toont enkele van de meest gebruikte methoden van de Thread klasse −

Sr.nr. Methode en beschrijving
1

public void Abort()

Verhoogt een ThreadAbortException in de thread waarop deze wordt aangeroepen, om het proces van het beëindigen van de thread te starten. Het aanroepen van deze methode beëindigt meestal de thread.

2

openbare statische LocalDataStoreSlot AllocateDataSlot()

Wijst een naamloos dataslot toe aan alle threads. Gebruik voor betere prestaties velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute.

3

openbare statische LocalDataStoreSlot AllocateNamedDataSlot(stringnaam)

Wijst een benoemd dataslot toe aan alle threads. Gebruik voor betere prestaties velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute.

4

openbare statische leegte BeginCriticalRegion()

Brengt een host op de hoogte dat de uitvoering op het punt staat een codegebied binnen te gaan waarin de effecten van een draadafbreking of onverwerkte uitzondering andere taken in het toepassingsdomein in gevaar kunnen brengen.

5

openbare statische leegte BeginThreadAffinity()

Waarschuwt een host dat beheerde code op het punt staat instructies uit te voeren die afhankelijk zijn van de identiteit van de huidige fysieke besturingssysteemthread.

6

openbare statische leegte EndCriticalRegion()

Brengt een host op de hoogte dat de uitvoering op het punt staat een codegebied binnen te gaan waarin de effecten van een threadafbreking of onverwerkte uitzondering beperkt zijn tot de huidige taak.

7

openbare statische leegte EndThreadAffinity()

Waarschuwt een host dat de beheerde code klaar is met het uitvoeren van instructies die afhankelijk zijn van de identiteit van de huidige fysieke besturingssysteemthread.

8

public static void FreeNamedDataSlot(string name)

Elimineert de associatie tussen een naam en een slot, voor alle threads in het proces. Gebruik voor betere prestaties velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute.

9

openbaar statisch object GetData (LocalDataStoreSlot-slot)

Haalt de waarde op uit het opgegeven slot op de huidige thread, binnen het huidige domein van de huidige thread. Gebruik voor betere prestaties velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute.

10

openbare statische AppDomain GetDomain()

Retourneert het huidige domein waarin de huidige thread wordt uitgevoerd.

11

openbare statische AppDomain GetDomainID()

Retourneert een unieke toepassingsdomein-ID

12

openbare statische LocalDataStoreSlot GetNamedDataSlot(stringnaam)

Zoekt een genoemd dataslot op. Gebruik voor betere prestaties velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute.

13

public void Interrupt()

Onderbreekt een thread die de status WaitSleepJoin heeft.

14

public void Join()

Blokkeert de aanroepende thread totdat een thread wordt beëindigd, terwijl het standaard COM- en SendMessage-pompen blijft uitvoeren. Deze methode heeft verschillende overbelaste vormen.

15

openbare statische leegte MemoryBarrier()

Synchroniseert geheugentoegang als volgt:de processor die de huidige thread uitvoert, kan de instructies niet opnieuw ordenen op een zodanige manier dat geheugentoegangen voorafgaand aan de aanroep van MemoryBarrier worden uitgevoerd na geheugentoegangen die volgen op de aanroep van MemoryBarrier.

16

openbare statische leegte ResetAbort()

Annuleert een verzoek tot afbreken voor de huidige thread.

17

public static void SetData(LocalDataStoreSlot slot, Object data)

Stelt de gegevens in in het opgegeven slot op de momenteel actieve thread, voor het huidige domein van die thread. Gebruik in plaats daarvan velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute voor betere prestaties.

18

public void Start()

Start een thread.

19

public static void Sleep(int millisecondsTimeout)

Laat de draad een tijdje pauzeren.

20

openbare statische leegte SpinWait(int iteraties)

Zorgt ervoor dat een thread het aantal keren wacht dat is gedefinieerd door de parameter iteraties

21

openbare statische byte VolatileRead(ref byte-adres)

public static double VolatileRead(ref dubbel adres)

public static int VolatileRead(ref int adres)

openbaar statisch Object VolatileRead (ref Objectadres)

Leest de waarde van een veld. De waarde is de laatste die door een processor in een computer is geschreven, ongeacht het aantal processors of de status van de processorcache. Deze methode kent verschillende overbelaste vormen. Slechts enkele zijn hierboven gegeven.

22

public static void VolatileWrite(ref byte adres,byte waarde)

public static void VolatileWrite(ref dubbel adres, dubbele waarde)

public static void VolatileWrite(ref int adres, int value)

public static void VolatileWrite(ref Objectadres, Objectwaarde)

Schrijft direct een waarde naar een veld, zodat de waarde zichtbaar is voor alle processors in de computer. Deze methode kent verschillende overbelaste vormen. Slechts enkele zijn hierboven gegeven.

23

openbare statische bool-opbrengst()

Zorgt ervoor dat de aanroepende thread uitvoering geeft aan een andere thread die klaar is om op de huidige processor te worden uitgevoerd. Het besturingssysteem selecteert de thread waaraan moet worden toegegeven.

Draden maken

Threads worden gemaakt door de klasse Thread uit te breiden. De uitgebreide Thread-klasse roept dan de Start() . aan methode om de uitvoering van de onderliggende thread te starten.

Het volgende programma demonstreert het concept −

Live demo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −

In Main: Creating the Child thread
Child thread starts

Threads beheren

De klasse Thread biedt verschillende methoden voor het beheren van threads.

Het volgende voorbeeld demonstreert het gebruik van de sleep() methode om een ​​thread voor een bepaalde tijd te laten pauzeren.

Live demo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
         
         // the thread is paused for 5000 milliseconds
         int sleepfor = 5000; 
         
         Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
         Thread.Sleep(sleepfor);
         Console.WriteLine("Child thread resumes");
      }
      
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

Draden vernietigen

De Afbreken() methode wordt gebruikt voor het vernietigen van threads.

De runtime breekt de thread af door een ThreadAbortException . Deze uitzondering kan niet worden opgevangen, de controle wordt verzonden naar de eindelijk eventueel blokkeren.

Het volgende programma illustreert dit −

Live demo
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         try {
            Console.WriteLine("Child thread starts");
            
            // do some work, like counting to 10
            for (int counter = 0; counter <= 10; counter++) {
               Thread.Sleep(500);
               Console.WriteLine(counter);
            }
            
            Console.WriteLine("Child Thread Completed");
         } catch (ThreadAbortException e) {
            Console.WriteLine("Thread Abort Exception");
         } finally {
            Console.WriteLine("Couldn't catch the Thread Exception");
         }
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         
         //stop the main thread for some time
         Thread.Sleep(2000);
         
         //now abort the child
         Console.WriteLine("In Main: Aborting the Child thread");
         
         childThread.Abort();
         Console.ReadKey();
      }
   }
}

Wanneer de bovenstaande code wordt gecompileerd en uitgevoerd, levert dit het volgende resultaat op −

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

C Taal

  1. Kleine versus grote draaddiameter van bevestigingsmiddelen
  2. Thread
  3. Thread Vs. ZigBee (voor IoT-ingenieurs)
  4. Behandelingsopties voor draadjes analyseren
  5. Multithreading in Java-zelfstudie met programma en voorbeelden
  6. C++ Multithreading
  7. Python - Programmeren met meerdere threads
  8. Edge Computing krijgt eindelijk een framework
  9. Verlichting aan de achterkant wordt snel
  10. De digitale discussie begrijpen
  11. Wat is een draadafsnijder?