C# – Multithreading

1. Was ist Multithreading?

1. Prozess

Wenn ein Programm ausgeführt wird, handelt es sich um einen Prozess. Der Prozess umfasst das laufende Programm sowie die vom Programm verwendeten Speicher- und Systemressourcen. Und ein Prozess besteht aus mehreren Threads.

2. Thread

Ein Thread ist ein Ausführungsablauf in einem Programm. Jeder Thread verfügt über eigene dedizierte Register (Stapelzeiger, Programmzähler usw.), der Codebereich wird jedoch gemeinsam genutzt, dh verschiedene Threads können dieselbe Funktion ausführen.

3. Griff

Ein Handle ist eine Kennung eines Objekts oder einer Instanz im Windows-System. Zu diesen Objekten gehören Module, Anwendungsinstanzen, Fenster, Steuerelemente, Bitmaps, GDI-Objekte, Ressourcen, Dateien usw.

4. Multithreading

(1) Das Konzept des Multithreadings

Multithreading bedeutet, dass ein Programm mehrere Ausführungsströme enthält. Das heißt, ein Programm kann mehrere verschiedene Threads gleichzeitig ausführen, um unterschiedliche Aufgaben auszuführen. Das heißt, ein einzelnes Programm darf mehrere parallele Ausführungsthreads erstellen, um seine jeweiligen Aufgaben auszuführen .

(2) Vorteile von Multithreading

Kann die CPU-Auslastung verbessern. Wenn in einem Multithread-Programm ein Thread warten muss, kann die CPU andere Threads ausführen, anstatt zu warten, was die Effizienz des Programms erheblich verbessert. (Opfere Weltraum-Computing-Ressourcen im Austausch für Zeit)

(3) Nachteile von Multithreading

  • Threads sind auch Programme, daher müssen Threads zum Ausführen Computerressourcen beanspruchen. Je mehr Threads vorhanden sind, desto mehr Ressourcen werden beansprucht. (nimmt mehr Speicher in Anspruch)
  • Multithreading erfordert Koordination und Verwaltung, daher muss die CPU Threads verfolgen und CPU-Ressourcen verbrauchen. (entfällt mehr CPU)
  • Der Zugriff auf gemeinsam genutzte Ressourcen zwischen Threads wirkt sich gegenseitig aus, und das Problem des Wettbewerbs um gemeinsam genutzte Ressourcen muss gelöst werden. Es gibt Probleme bei der gemeinsamen Nutzung von Ressourcen beim Multithreading.)
  • Zu viele Threads führen zu einer zu komplizierten Steuerung, was letztendlich zu vielen Fehlern führen kann. (Verwaltung ist mühsam und anfällig für Fehler)

(4) Warum können Computer Multithreading betreiben?

  • Der Betrieb des Programms erfordert Computerressourcen, und das Betriebssystem fordert die CPU auf, es zu verarbeiten. Wenn die CPU eine Aktion ausführt, wird sie in Teilen ausgeführt.
  • Fragmentierung: Teilen Sie die Verarbeitungsleistung der CPU auf. Wenn das Betriebssystem plant, verarbeitet es unterschiedliche Rechenanforderungen entsprechend den Slices und weist Slice-Rechenressourcen gemäß den Regeln zu. Für denselben Computerkern sind alle Vorgänge seriell Ja, aber weil Angesichts der Fragmentierung hat man das Gefühl, als würden mehrere Programme gleichzeitig voranschreiten.

(5) Wann wird die Verwendung von Multithreading empfohlen?

  • Wenn der Hauptthread versucht, langwierige Vorgänge auszuführen, das System die Schnittstelle jedoch einfriert, ist die Erfahrung sehr schlecht. Zu diesem Zeitpunkt kann ein neuer Thread erstellt werden, um diese langwierige Arbeit zu erledigen.
  • Beim Anfordern anderer Datenbankserver, Business-Server usw. kann ein neuer Thread erstellt werden und der Hauptthread kann weiterhin andere Dinge tun.
  • Verwenden Sie Multithreading, um komplexe Berechnungen aufzuteilen und die Berechnungsgeschwindigkeit zu verbessern.

(6) Wann wird die Verwendung von Multithreading nicht empfohlen?

Wenn ein einzelner Thread gut gelöst werden kann, verwenden Sie Multithreading nicht um der Verwendung von Multithreading willen.

5. Synchron und asynchron

(1) Synchrone Methode

Lineare Ausführung, sequentielle Ausführung von oben nach unten, synchrone Methodenausführung ist langsam und verbraucht weniger Computerressourcen.

(2) Asynchrone Methode

Zwischen Threads gibt es keine lineare Ausführung mehr. Der Gesamtzeitverbrauch mehrerer Threads ist geringer, die Ausführung ist schnell und der Verbrauch an Computerressourcen ist groß. Die Ausführung jedes Threads ist nicht in der richtigen Reihenfolge.

6. Multithreading in C#

Thread/ThreadPool/Task sind alle Hilfeklassenbibliotheken, die beim Betrieb von Computerressourcen in der C#-Sprache gekapselt sind.

private static void NewThreadLogic() {                     
    // 新开线程 执行的代码逻辑 在该函数语句块中                                
    while (isRuning)                                       
        // Thread.Sleep(1000);                              
        // Console.WriteLine("新开线程代码逻辑");                   
    {                                                      
        lock (obj) {                                       
            Console.SetCursorPosition(10, 5);              
            Console.ForegroundColor = ConsoleColor.Yellow; 
            Console.Write("■");                            
        }                                                  
    }                                                      
}                                                          

// 线程类 Thread                                                                 
// 需要引用命名空间 using System.Threading;                                           
// 1.申明一个新的线程                                                                 
//   注意 线程执行的代码 需要封装到一个函数中                                                    
//   新线程 将要执行的代码逻辑 被封装到了一个函数语句块中                                              
Thread t = new Thread(NewThreadLogic);                                       
// 2.启动线程                                                                     
t.Start();                                                                   
                                                                             
// 3.设置为后台线程                                                                  
// 当前台线程都结束了的时候,整个程序也就结束了,即使还有后台线程正在运行                                        
// 后台线程不会防止应用程序的进程被终止掉                                                        
// 如果不设置为后台线程 可能导致进程无法正常关闭                                                    
t.IsBackground = true;                                                       
                                                                             
// 4.关闭释放一个线程                                                                 
// 如果开启的线程中不是死循环 是能够结束的逻辑 那么 不用刻意的去关闭它                                        
// 如果是死循环 想要中止这个线程 有两种方式                                                      
// 4.1-死循环中bool标识                                                             
// Console.ReadKey();                                                         
                                                                             
// isRuning = false;                                                          
                                                                             
// Console.ReadKey();                                                         
                                                                             
// 4.2-通过线程提供的方法(注意在.Net core版本中无法中止 会报错)                                     
// 中止线程                                                                       
// try                                                                        
// {                                                                          
//     t.Abort();                                                             
//     t = null;                                                              
// }                                                                          
// catch                                                                      
// {                                                                          
                                                                              
// }                                                                          
                                                                             
// 5.线程休眠                                                                     
// 让线程休眠多少毫秒  1s = 1000毫秒                                                     
// 在哪个线程里执行 就休眠哪个线程                                                           
// Thread.Sleep(1000);                                                        
                                                                             
// 线程之间共享数据                                                        
                                                                             
// 多个线程使用的内存是共享的,都属于该应用程序(进程)                                                 
// 所以要注意 当多线程 同时操作同一片内存区域时可能会出问题                                              
// 可以通过加锁的形式避免问题                                                              
                                                                             
// lock                                                                       
// 当我们在多个线程当中想要访问同样的东西 进行逻辑处理时                                                
// 为了避免不必要的逻辑顺序执行的差错                                                          
// lock(引用类型对象)                                                               
                                                                             
while (true) {                                                               
    lock (obj) {                                                             
        Console.SetCursorPosition(0, 0);                                     
        Console.ForegroundColor = ConsoleColor.Red;                          
        Console.Write("●");                                                  
    }                                                                        
}                                                                            
                                                                             
// 多线程对于我们的意义                                                      
                                                                             
//可以用多线程专门处理一些复杂耗时的逻辑                                                        
//比如 寻路、网络通信等等                                                               

​ Multithreading sind mehrere „Pipelines“, die Codelogik gleichzeitig ausführen können.
Multithreading kann durch Code aktiviert werden, und Multithreading kann verwendet werden, um komplexe Logik zu verarbeiten, die sich auf die Fließfähigkeit des Hauptthreads auswirken kann.
Stichwort-Thread

Guess you like

Origin blog.csdn.net/weixin_53163894/article/details/131459050