ホームページ > バックエンド開発 > C#.Net チュートリアル > C#のスレッド制御例を詳しく解説

C#のスレッド制御例を詳しく解説

零下一度
リリース: 2017-06-23 16:34:03
オリジナル
2227 人が閲覧しました

オプション 1:

スレッド制御メソッドを呼び出します。 Stop: Thread.Abort(); Continue: 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();  // 继续}
ログイン後にコピー
スレッドは次のように定義されています:
            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);
                }
            });
ログイン後にコピー

次のことに注意してください: Thread.Abort() によって停止されたスレッド (または自動的に終了するスレッド) Thread.Start() メソッドを通じて直接再開する場合は、スレッドを再作成して開始する必要があります。
したがって、「スタート ボタン」イベントは次のようになります:

        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();  // 开始}
ログイン後にコピー

さらに、Thread.Suspend() メソッドと Thread.Resume() メソッドについて、Microsoft はそれらを

廃止:

Thread としてマークしました。 Suspend は非推奨になりました。Monitor、Mutex、Event、Semaphore などの System.Threading の他のクラスを使用して、スレッドを同期したりリソースを保護してください (Thread.Suspend

は非推奨になりました。System.Threading の他のクラスを使用してください)。 、スレッドを同期したりリソースを保護したりするためのモニター、ミューテックス、イベント、セマフォなど)

現在中断されているときにスレッドがどのようなコードを実行しているかを知る方法がないからです。ロックを保持しているスレッドがセキュリティ権限の評価中に一時停止されると、AppDoamin 内の他のスレッドがブロックされる可能性があります。コンストラクターの実行中にスレッドを一時停止すると、クラスを使用しようとする AppDomain 内の他のスレッドがブロックされます。これではデッドロックが発生しやすくなります。

オプション 2:

スレッド実行プロセス中 (関数/コマンドの完了後など)、適切な位置でスレッドを続行するかどうかを決定し、スレッドの運命を決定します。 1. グローバル変数を定義します:

int

mTdFlag = 0;

// 1: 通常動作; 2: 一時停止; 3: 停止

2. 判定方法を定義します:

        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.制御コマンド イベントを変更します:

        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. スレッド実行プロセス中の適切な位置で、スレッドが継続するかどうかを判断します

            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 += "线程已结束";
                }
            });
ログイン後にコピー

フォームで、クロススレッド アクセスの問題を解決します。フォーム コンストラクター コードを追加します: Control.CheckForIllegalCrossThreadCalls = false;

[]

以上がC#のスレッド制御例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート