亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

C#怎么優雅地終止線程

發布時間:2023-03-21 09:54:38 來源:億速云 閱讀:164 作者:iii 欄目:開發技術

今天小編給大家分享一下C#怎么優雅地終止線程的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

需求說明

現在有一個需求:有一個后臺線程,定時(300ms)輸出一段內容,但不希望它一直運行,所以設置了超時時間(3s),希望在超時結束后,便執行后續的內容。

初始版本

根據需求,開發了第一個版本的代碼,步驟如下:

  • 定義一個Task。

  • 在Task內,運行死循環,每間隔300毫秒,輸出一段內容。

  • 設置Task的等待超時時間,超時結束后,運行后續內容。

具體代碼如下所示:

namespace DemoTask
{
    internal class Program
    {
        static void Main(string[] args)
        {
            TestTask();
            Console.ReadKey();
        }

        /// <summary>
        /// 測試任務
        /// </summary>
        public static void TestTask()
        {
            Console.WriteLine("程序開始.");
            var task = Task.Run(() =>
            {
                while (true)
                {
                    Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在運行...");
                    Thread.Sleep(300);
                }
            });
            task.Wait(3000);
            Console.WriteLine("程序超時結束.");
        }
    }
}

信心滿滿的運行程序,但是期待的結果并沒有出現,在超時時間后,并沒有預期的停止任務,反而在繼續運行。如下所示:

C#怎么優雅地終止線程

注意:通過以上程序發現,Wait方法只是等待時間結束后不再等待,但是原有任務并未結束,而是繼續運行。

進階版本

為了解決線程無法結束的問題,微軟官方給出的方案是采用CancellationTokenSource,向應該被取消的線程發送信號。即在線程內部判斷是否收到取消請求,在外部發起取消請求信號。步驟如下:

  • 定義一個Task。

  • 在Task內,當沒有收到取消信號時,每間隔300毫秒,輸出一段內容。

  • 設置Task的等待超時時間,超時結束后,發起取消信號,并運行后續內容。

具體代碼如下所示:

/// <summary>
/// 測試任務
/// </summary>
public static void TestTask()
{
    Console.WriteLine("程序開始.");
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken token = cts.Token;
    var task = Task.Run(() =>
    {
        while (!token.IsCancellationRequested)
        {
            Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在運行...");
            Thread.Sleep(300);
        }
    });
    bool flag = task.Wait(3000);
    if (!flag) {
        cts.Cancel();
    }
    Console.WriteLine("程序超時結束.");
}

優化程序后,運行程序如下所示:

C#怎么優雅地終止線程

注意:經過以上程序優化后,確實是如預想的結果一致,程序在等待超時時間后,停止了運行。

最終版本

正常情況下,如果是我們自己開發的程序,程序到第二個版本就已經解決問題了,但是假如While循環的內容是第三方提供的程序,已經封裝為固定模塊,我們無法進行修改,那應該如何才能終止死循環呢?如何才能像任務管理器結束進程一樣,結束這一直無休止運行的程序呢?

為了解決我們的難題,對程序進行進一步的優化,步驟如下:

  • 定義一個Task。

  • 在Task內,注冊線程的Abort方法,在未調用Abort方法時,每間隔300毫秒,輸出一段內容。

  • 設置Task的等待超時時間,超時結束后,發起取消信號,并運行后續內容。

具體代碼如下所示:

/// <summary>
/// 測試任務
/// </summary>
public static void TestTask()
{
    Console.WriteLine("程序開始.");
    CancellationTokenSource cts = new CancellationTokenSource();
    CancellationToken token = cts.Token;
    var task = Task.Run(() =>
    {
        using (token.Register((Thread.CurrentThread.Abort)))
        {
            //假設以下內容第3方提供,無法修改
            while (true)
            {
                Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}程序正在運行...");
                Thread.Sleep(300);
            }
            //以上內容第3方提供
        }
    });
    bool flag = task.Wait(3000);
    if (!flag)
    {
        cts.Cancel();
    }
    Console.WriteLine("程序超時結束.");
}

優化程序后,運行程序如下所示:

C#怎么優雅地終止線程

以上就是“C#怎么優雅地終止線程”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

攀枝花市| 武定县| 青岛市| 天津市| 格尔木市| 宁远县| 武邑县| 巍山| 桦南县| 织金县| 乌拉特中旗| 合山市| 海原县| 汉沽区| 深州市| 扶余县| 怀化市| 天全县| 汝南县| 开江县| 原阳县| 泰宁县| 宝清县| 军事| 镇远县| 孝感市| 孟连| 浦北县| 嘉定区| 桑日县| 镇平县| 历史| 聊城市| 天水市| 平远县| 临城县| 嘉峪关市| 本溪市| 石门县| 剑川县| 大埔区|