91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#線程控制的示例分析

發布時間:2021-03-06 14:06:39 來源:億速云 閱讀:144 作者:小新 欄目:編程語言

這篇文章主要介紹C#線程控制的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

方案一:

調用線程控制方法.啟動:Thread.Start();停止:Thread.Abort();暫停:Thread.Suspend();繼續:Thread.Resume();

C#線程控制的示例分析

        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() 方法,微軟已經將其標記為過時:

Thread.Suspend has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  (Thread.Suspend 已被否決。請使用系統中的其他類線程,如監視器、互斥體、事件和信號量,以同步線程或保護資源。)

因為,無法判斷當前掛起線程時它正在執行什么代碼。如果在安全權限評估期間掛起持有鎖的線程,則 AppDoamin 中的其它線程可能被阻止。如果在線程正執行構造函數時掛起它,則 AppDomain 中嘗試使用該類的其它線程將被阻止。這樣容易發生死鎖。

方案二:

在 線程運行過程中 適當的位置(如某個完整的功能/命令后)判斷是否要繼續線程,再決定線程的命運。

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#線程控制的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新巴尔虎右旗| 都安| 韶关市| 遂溪县| 驻马店市| 白朗县| 龙岩市| 忻州市| 汶川县| 鸡西市| 遂溪县| 岑溪市| 台湾省| 肥乡县| 闽清县| 淄博市| 乐陵市| 肥西县| 东海县| 铜陵市| 溧水县| 山阴县| 阳高县| 高陵县| 南宁市| 黑龙江省| 舟曲县| 蓬溪县| 大庆市| 任丘市| 纳雍县| 秭归县| 迭部县| 托克托县| 施秉县| 稷山县| 中山市| 汉中市| 门源| 兖州市| 乡宁县|