Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de contrôle de thread C#

Explication détaillée d'exemples de contrôle de thread C#

零下一度
零下一度original
2017-06-23 16:34:032194parcourir

Option 1 :

Appelez la méthode de contrôle des threads Start : Thread.Start(); Stop : Thread. . Abandonner();Pause :Thread.Suspend();Continuer :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();  // 继续}

Les threads sont définis comme :

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

Il convient de noter que : Les threads arrêtés par Thread.Abort() (Ou un thread qui se termine tout seul) ne peut pas être redémarré directement via la méthode Thread.Start(), et un nouveau thread doit être créé pour démarrer.

Ainsi, l'événement "Start Button" devrait être :

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

De plus, pour les méthodes Thread.Suspend() et Thread.Resume(), Microsoft l'a marqué comme obsolète :

Thread.Suspend est obsolète. Veuillez utiliser d'autres classes dans System.Threading, telles que Monitor, Mutex, Event,. et Semaphore, pour synchroniser les threads ou protéger les ressources. )Parce qu'il n'y a aucun moyen de savoir quel code il exécute lorsque le thread est actuellement suspendu. Si le thread détenant le verrou est suspendu lors de l'évaluation des autorisations de sécurité, d'autres threads de AppDoamin peuvent être bloqués. Si vous suspendez un thread pendant l'exécution du constructeur, les autres threads de l'AppDomain qui tentent d'utiliser la classe seront bloqués. Ceci est sujet à une impasse.

Option 2 : Déterminer s'il faut continuer à un moment approprié du processus d'exécution du thread (par exemple après une fonction/commande complète) fil, puis déterminez le sort du fil.

1. Définissez une variable globale :

int

mTdFlag = 0; // 1 : Fonctionnement normal ; 2 : Pause 3 : Arrêt 2. Définir une méthode de jugement :

        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,线程继续}
3. Modifier l'événement de commande de contrôle :

        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();  // 继续}
4. À la position appropriée pendant le processus d'exécution du fil, déterminez si le fil continue

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

Dans le formulaire, résolvez le problème du fil croisé accès :

Ajouter du code dans le constructeur de formulaire : Control.CheckForIllegalCrossThreadCalls = false;

[]

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn