Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung der Thread-Klasse für Multithreading in C#
Verwenden Sie die Klasse System.Threading.Thread, um Threads zu erstellen und zu steuern.
Häufig verwendete Konstruktoren sind:
// 摘要: // 初始化 System.Threading.Thread 类的新实例,指定允许对象在线程启动时传递给线程的委托。//// 参数: // start:// System.Threading.ParameterizedThreadStart 委托,它表示此线程开始执行时要调用的方法。//// 异常: // System.ArgumentNullException:// start 为 null。 [SecuritySafeCritical]public Thread(ParameterizedThreadStart start);//// 摘要: // 初始化 System.Threading.Thread 类的新实例。//// 参数: // start:// System.Threading.ThreadStart 委托,它表示此线程开始执行时要调用的方法。//// 异常: // System.ArgumentNullException:// start 参数为 null。 [SecuritySafeCritical]public Thread(ThreadStart start);
1. Erstellen Sie einen Thread ohne Parameter
ThreadStart-Delegat definiert eine parameterlose Methode mit dem Rückgabetyp void.
public void Main() { Thread vThread = new Thread(ThreadFun);//vThread.Name = "td_Name"; // 线程名称vThread.Start(); //开始执行线程Console.WriteLine("This is the main thread:id=" + Thread.CurrentThread.ManagedThreadId); }void ThreadFun() // 来自委托:ThreadStart { Console.WriteLine("Running in a new thread:id=" + Thread.CurrentThread.ManagedThreadId);for (int i = 0; i < 10; i++) { Console.Write("."); Thread.Sleep(500); } Console.WriteLine("THREAD END"); }
Ausgabeergebnis:
Verwenden Sie ThreadFun() im Einspruchscode mit Lambda-Ausdruck Ersetzen Sie durch die einfache Art und Weise, Thread zu verwenden:
public void Main() { Thread vThread = new Thread(() =>{ Console.WriteLine("Running in a new thread");});//vThread.Name = "td_Name"; // 线程名称vThread.Start(); //开始执行线程Console.WriteLine("This is the main thread"); }
2. Übergeben Sie Parameter an den Thread
Zwei Möglichkeiten: Eine besteht darin, Thread mithilfe von Methodenparametern mit ParameterizedThreadStartDelegate zu erstellen; die andere besteht darin, eine benutzerdefinierte Klasse zu erstellen und den Thread zu definieren Methode als Instanzmethode, sodass zuerst die Instanzdaten initialisiert und dann der Thread gestartet wird.
Zum Beispiel: Übergabe von Parametern
public struct TdData // 传递数据 {public string Message; //数据string字段}
Verwenden Sie die erste Methode:
public void Main() { TdData tData = new TdData() { Message = "Thread Info" }; Thread vThread = new Thread(ThreadFun); vThread.Start(tData); // 开始执行线程,传递参数Console.WriteLine("This is the main thread"); }void ThreadFun(object pObj) // 来自委托:ParameterizedThreadStart { TdData vData = (TdData)pObj; Console.WriteLine("In a new thread, Received:{0}", vData.Message); }
Verwenden Sie die zweite Methode: Passen Sie zuerst eine Klasse an.
public class TdHelper {public TdData mData; // 传递数据// 构造函数public TdHelper(TdData pData) {this.mData = pData; }public void ThreadFun() // 来自委托:ThreadStart { Console.WriteLine("In a new thread, TdDataMessage:{0}", mData.Message); } }
Erstellen Sie dann einen Thread im Hauptthread (wo erforderlich) und verwenden Sie die Instanzmethode TdHelper.ThreadFun() als Parameter des Konstruktors.
public void Main() { TdData tData = new TdData() { Message = "Thread Info" }; TdHelper tHelper = new TdHelper(tData); // 传递参数Thread vThread = new Thread(tHelper.ThreadFun); vThread.Start(); Console.WriteLine("This is the main thread"); }
3. Hintergrundthread
Standardmäßig ist der von der Thread-Klasse erstellte Thread ein Vordergrund-Thread und die Threads im Thread-Pool sind immer Hintergrund-Threads. Solange ein Vordergrund-Thread läuft, läuft der Anwendungsprozess. Wenn mehrere Vordergrund-Threads laufen und die Main()-Methode endet, ist die Anwendung weiterhin aktiv, bis alle Vordergrund-Threads ihre Aufgaben abgeschlossen haben.
Sie können das Attribut IsBackground der Thread-Klasseninstanz festlegen, um sie zu einem Hintergrundthread zu machen
public void Main() { Thread vThread = new Thread(() =>{ Console.WriteLine("New thread started"); // Title3Thread.Sleep(5000); Console.WriteLine("New thread completed"); // Title2});//vThread.IsBackground = true; vThread.Start(); Console.WriteLine("This is the main thread"); // Title1}
Wenn die IsBackground-Eigenschaft standardmäßig auf „false“ gesetzt ist, können Sie die drei Sätze der Ausgabeinformationen vollständig in der Konsole sehen, aber wenn sie auf „true“ gesetzt ist, Dies wird nicht der Fall sein. Wenn die dritte Nachricht (Title2) ausgegeben wird, hat der Hauptthread Main() die Ausführung abgeschlossen und das Konsolenfenster wird automatisch geschlossen.
4. Thread-Priorität Über das Priority-Attribut können Sie die Priorität der Thread-Klasseninstanz anpassen. Priority = ThreadPriority.Normal; // Aufzählungswert: Highest > AboveNormal > BelowNormal > 5. Kontrollthread
Rufen Sie die Start()-Methode des Thread-Objekts auf, um einen Thread zu erstellen. Nach dem Aufruf der Start()-Methode befindet sich der neue Thread jedoch immer noch nicht im Status „Running“, sondern im Status „Unstarted“. Der Thread wechselt nur dann in den Status „Wird ausgeführt“, wenn der Thread-Scheduler des Betriebssystems die Ausführung des Threads auswählt. Der aktuelle Status des Threads kann über die Eigenschaft Thread.ThreadState abgerufen werden.
Durch die Verwendung der Thread.Sleep()-Methode wird der Thread in den WaitSleepJoin-Status versetzt. Nach dem durch die Sleep()-Methode definierten Zeitraum wartet der Thread darauf, erneut vom Betriebssystem geplant zu werden. Um einen Thread zu stoppen, können Sie die Methode Thread.Abort() aufrufen. Der Aufruf dieser Methode löst eine ThreadAbortException in dem Thread aus, der den Beendigungsbefehl empfängt. Verwenden Sie einen Handler, um diese Ausnahme abzufangen, und der Thread kann einige Aufräumarbeiten abschließen, bevor er beendet wird. Ein Thread kann auch weiterarbeiten, nachdem er als Ergebnis des Aufrufs der Thread.Abort()-Methode eine ThreadAbortException-Ausnahme erhalten hat. Wenn der Thread ohne Zurücksetzen beendet wird, ändert sich der Status des Threads, der die Beendigungsanforderung erhalten hat, von „AbortRequested“ in „Aborted“. Wenn Sie auf das Ende des Threads warten möchten, können Sie die Methode Thread.Join() aufrufen, die den aktuellen Thread stoppt und ihn in den WaitSleepJoin-Status versetzt, bis der verbundene Thread abgeschlossen ist.
Siehe:
[]
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Thread-Klasse für Multithreading in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!