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

零下一度
零下一度Original
2017-06-23 16:34:032234Durchsuche

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

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

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

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,线程继续}

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

            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 += "线程已结束";
                }
            });
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!

Stellungnahme:
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