Heim > Backend-Entwicklung > C#.Net-Tutorial > Ausführliche Erläuterung von Beispielen zur C#-Thread-Steuerung

Ausführliche Erläuterung von Beispielen zur C#-Thread-Steuerung

零下一度
Freigeben: 2017-06-23 16:34:03
Original
2201 Leute haben es durchsucht

Option 1:

Aufrufen der Thread-Steuerungsmethode Start: Thread.Start(); Stop: Thread . Abort();Pause:Thread.Suspend();Weiter:Thread.Resume();

        private void btn_Start_Click(object sender, EventArgs e)
        {
            mThread.Start();  // 开始        }private void btn_Stop_Click(object sender, EventArgs e)
        {
            mThread.Abort();  // 终止        }private void btn_Suspend_Click(object sender, EventArgs e)
        {
            mThread.Suspend();  // 暂停        }private void btn_Resume_Click(object sender, EventArgs e)
        {
            mThread.Resume();  // 继续}
Nach dem Login kopieren

Threads sind definiert als:

            mThread = new Thread(() =>{try{for (int j = 0; j < 20; j++)
                    {int vSum = 0;this.textBox1.Text += "--->";for (int i = 0; i < 100000000; i++)
                        {if (i % 2 == 0)
                            {
                                vSum += i;
                            }else{
                                vSum -= i;
                            }
                        }this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
                        Thread.Sleep(1000);
                    }
                }catch (ThreadAbortException ex)
                {
                    Console.WriteLine("ThreadAbortException:{0}", ex.Message);
                }
            });
Nach dem Login kopieren

Es ist bemerkenswert dass: Threads durch Thread.Abort() gestoppt wurden (Oder ein Thread, der von selbst endet) kann nicht direkt über die Thread.Start()-Methode erneut gestartet werden, und zum Starten muss ein neuer Thread erstellt werden.

Das „Start Button“-Ereignis sollte also sein:

        private void btn_Start_Click(object sender, EventArgs e)
        {// 定义线程mThread = new Thread(() => // Lambda 表达式            {try{for (int j = 0; j < 20; j++)
                    {int vSum = 0;this.textBox1.Text += "--->";for (int i = 0; i < 100000000; i++)
                        {if (i % 2 == 0)
                            {
                                vSum += i;
                            }else{
                                vSum -= i;
                            }
                        }this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);
                        Thread.Sleep(1000);
                    }
                }catch (ThreadAbortException ex)
                {
                    Console.WriteLine("ThreadAbortException:{0}", ex.Message);
                }
            });

            mThread.Start();  // 开始}
Nach dem Login kopieren

Außerdem gilt für die Methoden Thread.Suspend() und Thread.Resume(): Microsoft hat Es ist als veraltet markiert:

Thread.Suspend wurde veraltet. Bitte verwenden Sie andere Klassen in System.Threading, z. B. Monitor, Mutex, Event. und Semaphore, um Threads zu synchronisieren oder Ressourcen zu schützen)Da es keine Möglichkeit gibt, festzustellen, welcher Code ausgeführt wird, wenn der Thread derzeit angehalten ist. Wenn der Thread, der die Sperre hält, während der Auswertung der Sicherheitsberechtigungen angehalten wird, werden möglicherweise andere Threads im AppDoamin blockiert. Wenn Sie einen Thread anhalten, während er den Konstruktor ausführt, werden andere Threads in der AppDomain, die versuchen, die Klasse zu verwenden, blockiert. Dies ist anfällig für Deadlocks.

Option 2: Bestimmen Sie, ob an einem geeigneten Punkt im Thread-Ausführungsprozess fortgefahren werden soll (z. B. nach einer vollständigen Funktion/einem vollständigen Befehl). Thread, und bestimmen Sie dann das Schicksal des Threads.

1. Definieren Sie eine globale Variable:

int

mTdFlag = 0; // 1: Normaler Betrieb; 2: Pause 3: Stopp; 2. Definieren Sie eine Beurteilungsmethode:

3. Ändern Sie das Steuerbefehlsereignis:
        bool WaitForContinue()
        {if (this.mTdFlag == 3)
            {return false; // 返回false,线程停止            }else if (this.mTdFlag == 2)
            {while (mTdFlag != 1)
                {
                    Thread.Sleep(200); // 假暂停;停顿时间越短,越灵敏if (this.mTdFlag == 3)
                    {return false; // 返回false,线程停止                    }
                }
            }return true; // 返回true,线程继续}
Nach dem Login kopieren

4. Bestimmen Sie an einer geeigneten Position während des Thread-Laufvorgangs, ob der Thread fortgesetzt wird.
        private void btn_Stop_Click(object sender, EventArgs e)
        {this.mTdFlag = 3;//mThread.Abort();  // 终止        }private void btn_Suspend_Click(object sender, EventArgs e)
        {this.mTdFlag = 2;//mThread.Suspend();  // 暂停        }private void btn_Resume_Click(object sender, EventArgs e)
        {this.mTdFlag = 1;//mThread.Resume();  // 继续}
Nach dem Login kopieren

            mThread = new Thread(() =>{try{for (int j = 0; j < 20; j++)
                    {int vSum = 0;this.textBox1.Text += "--->";for (int i = 0; i < 100000000; i++)
                        {if (i % 2 == 0)
                            {
                                vSum += i;
                            }else{
                                vSum -= i;
                            }if (i % 10000000 == 0)
                            {this.textBox1.Text += ".";
                            }if (!WaitForContinue()) // 返回 false 则,停止                            {break;//return;                            }
                        }this.textBox1.Text += string.Format("{0} => vSum = {1}\r\n", DateTime.Now.ToString(), vSum);if (!WaitForContinue()) // 返回 false 则,停止                        {break;// return;                        }
                        Thread.Sleep(1000);
                    }
                }catch (ThreadAbortException ex)
                {
                    Console.WriteLine("ThreadAbortException:{0}", ex.Message);this.textBox1.Text += ex.Message + "...";
                }finally{this.textBox1.Text += "线程已结束";
                }
            });
Nach dem Login kopieren
Lösen Sie im Formular das Problem des Cross-Threads Zugriff:

Code im Formularkonstruktor hinzufügen: Control.CheckForIllegalCrossThreadCalls = false;

[]

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen zur C#-Thread-Steuerung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage