Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

C# – Multithreading

Ein Faden ist als Ausführungspfad eines Programms definiert. Jeder Thread definiert einen einzigartigen Kontrollfluss. Wenn Ihre Anwendung komplizierte und zeitaufwändige Operationen umfasst, ist es oft hilfreich, verschiedene Ausführungspfade oder -threads festzulegen, wobei jeder Thread eine bestimmte Aufgabe ausführt.

Threads sind leichte Prozesse . Ein häufiges Beispiel für die Verwendung von Threads ist die Implementierung der gleichzeitigen Programmierung durch moderne Betriebssysteme. Die Verwendung von Threads spart CPU-Zyklus und erhöht die Effizienz einer Anwendung.

Bisher haben wir die Programme geschrieben, in denen ein einzelner Thread als einzelner Prozess ausgeführt wird, der die laufende Instanz der Anwendung ist. Auf diese Weise kann die Anwendung jedoch jeweils nur einen Job ausführen. Damit es mehr als eine Aufgabe gleichzeitig ausführt, könnte es in kleinere Threads unterteilt werden.

Thread-Lebenszyklus

Der Lebenszyklus eines Threads beginnt, wenn ein Objekt der System.Threading.Thread-Klasse erstellt wird, und endet, wenn der Thread beendet wird oder seine Ausführung abschließt.

Es folgen die verschiedenen Zustände im Lebenszyklus eines Threads −

Der Hauptfaden

In C# der System.Threading.Thread Klasse wird für die Arbeit mit Threads verwendet. Es ermöglicht das Erstellen und Zugreifen auf einzelne Threads in einer Multithread-Anwendung. Der erste Thread, der in einem Prozess ausgeführt wird, wird main genannt Faden.

Wenn ein C#-Programm mit der Ausführung beginnt, wird der Hauptthread automatisch erstellt. Die mit Thread erstellten Threads Klasse werden die untergeordneten Threads des Haupt-Threads genannt. Sie können mit CurrentThread auf einen Thread zugreifen -Eigenschaft der Thread-Klasse.

Das folgende Programm demonstriert die Ausführung des Haupt-Threads −

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();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −

This is MainThread

Eigenschaften und Methoden der Thread-Klasse

Die folgende Tabelle zeigt einige der am häufigsten verwendeten Eigenschaften des Threads Klasse −

Sr.No. Eigenschaft &Beschreibung
1

Aktueller Kontext

Ruft den aktuellen Kontext ab, in dem der Thread ausgeführt wird.

2

Aktuelle Kultur

Ruft die Kultur für den aktuellen Thread ab oder legt sie fest.

3

Aktuelles Prinzip

Ruft den aktuellen Prinzipal des Threads ab oder legt ihn fest (für rollenbasierte Sicherheit).

4

Aktueller Thread

Ruft den aktuell laufenden Thread ab.

5

Aktuelle UI-Kultur

Ruft die aktuelle Kultur ab oder legt sie fest, die vom Ressourcen-Manager verwendet wird, um zur Laufzeit nach kulturspezifischen Ressourcen zu suchen.

6

Ausführungskontext

Ruft ein ExecutionContext-Objekt ab, das Informationen über die verschiedenen Kontexte des aktuellen Threads enthält.

7

Ist am Leben

Ruft einen Wert ab, der den Ausführungsstatus des aktuellen Threads angibt.

8

IstHintergrund

Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob ein Thread ein Hintergrundthread ist oder nicht.

9

IstThreadPoolThread

Ruft einen Wert ab, der angibt, ob ein Thread zum verwalteten Thread-Pool gehört oder nicht.

10

ManagedThreadId

Ruft eine eindeutige Kennung für den aktuellen verwalteten Thread ab.

11

Name

Ruft den Namen des Threads ab oder legt ihn fest.

12

Priorität

Ruft einen Wert ab oder legt einen Wert fest, der die Scheduling-Priorität eines Threads angibt.

13

ThreadState

Ruft einen Wert ab, der die Zustände des aktuellen Threads enthält.

Die folgende Tabelle zeigt einige der am häufigsten verwendeten Methoden des Threads Klasse −

Sr.No. Methode &Beschreibung
1

public void Abort()

Löst eine ThreadAbortException in dem Thread aus, in dem sie aufgerufen wird, um mit dem Beenden des Threads zu beginnen. Der Aufruf dieser Methode beendet normalerweise den Thread.

2

öffentlicher statischer LocalDataStoreSlot AllocateDataSlot()

Weist allen Threads einen unbenannten Datenslot zu. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

3

öffentlicher statischer LocalDataStoreSlot AllocateNamedDataSlot(string name)

Weist allen Threads einen benannten Datenslot zu. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

4

öffentliche statische void BeginCriticalRegion()

Benachrichtigt einen Host, dass die Ausführung im Begriff ist, in einen Codebereich einzutreten, in dem die Auswirkungen eines Thread-Abbruchs oder einer nicht behandelten Ausnahme andere Aufgaben in der Anwendungsdomäne gefährden könnten.

5

öffentliches statisches void BeginThreadAffinity()

Benachrichtigt einen Host, dass verwalteter Code im Begriff ist, Anweisungen auszuführen, die von der Identität des aktuellen physischen Betriebssystem-Threads abhängen.

6

public static void EndCriticalRegion()

Benachrichtigt einen Host, dass die Ausführung im Begriff ist, in einen Codebereich einzutreten, in dem die Auswirkungen eines Thread-Abbruchs oder einer nicht behandelten Ausnahme auf die aktuelle Aufgabe beschränkt sind.

7

public static void EndThreadAffinity()

Benachrichtigt einen Host, dass verwalteter Code die Ausführung von Anweisungen beendet hat, die von der Identität des aktuellen physischen Betriebssystem-Threads abhängen.

8

public static void FreeNamedDataSlot(string name)

Beseitigt die Zuordnung zwischen einem Namen und einem Slot für alle Threads im Prozess. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

9

öffentliches statisches Objekt GetData(LocalDataStoreSlot Slot)

Ruft den Wert aus dem angegebenen Slot im aktuellen Thread innerhalb der aktuellen Domäne des aktuellen Threads ab. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

10

öffentliche statische AppDomain GetDomain()

Gibt die aktuelle Domäne zurück, in der der aktuelle Thread ausgeführt wird.

11

öffentliche statische AppDomain GetDomainID()

Gibt eine eindeutige Anwendungsdomänenkennung zurück

12

öffentlicher statischer LocalDataStoreSlot GetNamedDataSlot(string name)

Sucht nach einem benannten Datenslot. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

13

public void Interrupt()

Unterbricht einen Thread, der sich im WaitSleepJoin-Thread-Zustand befindet.

14

public void Join()

Blockiert den aufrufenden Thread, bis ein Thread beendet wird, während das standardmäßige COM- und SendMessage-Pumping fortgesetzt wird. Diese Methode hat verschiedene überladene Formen.

15

öffentliche statische void MemoryBarrier()

Synchronisiert den Speicherzugriff wie folgt:Der Prozessor, der den aktuellen Thread ausführt, kann Anweisungen nicht so umordnen, dass Speicherzugriffe vor dem Aufruf von MemoryBarrier nach Speicherzugriffen ausgeführt werden, die auf den Aufruf von MemoryBarrier folgen.

16

public static void ResetAbort()

Bricht einen für den aktuellen Thread angeforderten Abbruch ab.

17

public static void SetData(LocalDataStoreSlot Slot, Objektdaten)

Legt die Daten im angegebenen Slot des derzeit ausgeführten Threads für die aktuelle Domäne dieses Threads fest. Verwenden Sie für eine bessere Leistung stattdessen Felder, die mit dem ThreadStaticAttribute-Attribut gekennzeichnet sind.

18

public void Start()

Startet einen Thread.

19

public static void Sleep(int millisecondsTimeout)

Lässt den Thread für eine gewisse Zeit pausieren.

20

public static void SpinWait(int iterations)

Veranlasst einen Thread, so oft zu warten, wie durch den iterations-Parameter

definiert
21

öffentliches statisches Byte VolatileRead(ref byte address)

public static double VolatileRead(ref double address)

public static int VolatileRead(ref int address)

öffentliches statisches Objekt VolatileRead(ref Objektadresse)

Liest den Wert eines Feldes. Der Wert ist der zuletzt von einem beliebigen Prozessor in einem Computer geschriebene Wert, unabhängig von der Anzahl der Prozessoren oder dem Zustand des Prozessorcaches. Diese Methode hat verschiedene überladene Formen. Oben sind nur einige aufgeführt.

22

public static void VolatileWrite(ref byte address,byte value)

public static void VolatileWrite(ref double address, double value)

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

public static void VolatileWrite(ref Objektadresse, Objektwert)

Schreibt einen Wert sofort in ein Feld, sodass der Wert für alle Prozessoren im Computer sichtbar ist. Diese Methode hat verschiedene überladene Formen. Oben sind nur einige aufgeführt.

23

öffentlicher statischer Bool Yield()

Veranlasst den aufrufenden Thread, die Ausführung an einen anderen Thread zu übergeben, der bereit ist, auf dem aktuellen Prozessor ausgeführt zu werden. Das Betriebssystem wählt den Thread aus, dem nachgegeben werden soll.

Threads erstellen

Threads werden durch Erweitern der Thread-Klasse erstellt. Die erweiterte Thread-Klasse ruft dann Start() auf Methode, um die Ausführung des untergeordneten Threads zu starten.

Das folgende Programm demonstriert das Konzept −

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();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −

In Main: Creating the Child thread
Child thread starts

Threads verwalten

Die Thread-Klasse bietet verschiedene Methoden zum Verwalten von Threads.

Das folgende Beispiel demonstriert die Verwendung von sleep() Methode, um einen Thread für eine bestimmte Zeit pausieren zu lassen.

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();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −

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

Zerstören von Threads

Der Abbruch() Methode wird zum Zerstören von Threads verwendet.

Die Laufzeit bricht den Thread ab, indem sie eine ThreadAbortException auslöst . Diese Ausnahme kann nicht abgefangen werden, die Kontrolle wird an finally gesendet blockieren, falls vorhanden.

Das folgende Programm veranschaulicht dies −

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();
      }
   }
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis −

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 Sprache

  1. Kleine vs. große Gewindedurchmesser der Befestigungselemente
  2. Thread
  3. Thread vs. ZigBee (für IoT-Ingenieure)
  4. Analysieren von Thread-Behandlungsoptionen
  5. C++-Multithreading
  6. Python - Multithread-Programmierung
  7. Edge Computing bekommt endlich ein Framework
  8. Rückseitenbeleuchtung wird schnell
  9. Dem digitalen Faden einen Sinn geben
  10. Was ist ein Fadenabschneider?