簡體   English   中英

中止在方法中本地創建的線程

[英]Abort thread that is created locally in a method

下面的方法為連接到TCP偵聽器的每個客戶端創建並啟動一個新線程。

void StartClientCommuncationThread(TcpClient Client)
{
    Thread TcpClientThread = new Thread(new ParameterizedThreadStart(HandleClientCommTask));
    TcpClientThread.Start(Client);
}

我想在按下按鈕時中止所有線程,但我不知道創建了多少線程,我無法到達方法之外的線程。

按下按鈕后如何中止線程?

假設你實際上想要中止並且不僅僅是結束線程,是否有任何理由你不能將線程引用存儲在集合中然后對每個人調用abort()?

以下評論是對的。 如果您收聽取消令牌以結束線程會更好。 但是,有時你不控制某些線程,因為第三方庫,我們可以說在線程代碼中沒有響應。 這是打電話給中止的好時機。 請記住,沒有任何東西可以正常清理,你的finally塊可能無法執行,需要處理的句柄也不會被丟棄等等。調用abort是一件非常臟的工作。

如果你有權訪問線程中運行的代碼,你應該監聽取消令牌,或者甚至只是一個共享(volatile)布爾值,表明它有時間紓困。 如果線程中有一個長的Thread.Sleep() ,那么你應該用一個互斥體替換它,你可以用脈沖來喚醒線程並告訴它優雅地退出。

參考線程上的IsBackground屬性。 MSDN說

后台線程與前台線程相同,除了后台線程不會阻止進程終止。

因此,如果您需要在應用程序運行時終止該線程,則此屬性將不會執行任何操作。

這是一個說明這一點的例子

public class DisposeTest : IDisposable
{
    public void Run()
    {
        while (true)
        {
            Thread.Sleep(TimeSpan.FromDays(1));
        }

        Dispose();

    }
    public void Dispose()
    {
        Console.WriteLine("disposing");
    }
}

public class TestDriver
{
    static void Main(string[] args)
    {
        var diposeTest = new DisposeTest();

        var thread = new Thread(diposeTest.Run)
                            {
                                IsBackground = true
                            };
        thread.Start();

        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
}

在這個應用程序中,即使應用程序沒有掛起並且沒有錯誤退出,也不會被命中。 這是一個壞主意,因為你可以保持套接字打開,文件未關閉,sql查詢未完成,各種各樣的東西。

有很多方法可以結束一個線程,只要注意你如何結束它,因為如果你不小心這樣做,中止可能會導致副作用。

您可以做的是確保在開始之前使用IsBackground = true設置所有線程,然后在單擊按鈕時可以關閉所有線程所在的表單。 http://msdn.microsoft.com/en-us/library/aa457093.aspx 在此輸入鏈接說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM