天天看點

關閉子視窗并結束子視窗中建立的子線程

我們在子視窗中建立一個子線程來執行耗時任務,但使用者可能不想繼續等待,在耗時任務結束之前就關閉了子視窗。這時會發現,雖然視窗關閉了,但是執行耗時任務的線程還在繼續執行,這在大多數情況下是不合理的,而且占用系統資源,甚至會和其他程序發生沖突。下面有個方法可以在關閉子視窗時,将子線程也關閉掉。

一、添加一個視窗關閉的事件。

1.添加前台代碼:

Closed="ImportWindow_Closed"
           

2.添加背景代碼:

private void ImportWindow_Closed(object sender, EventArgs e)//該事件在視窗關閉後執行
        {
            
        }
           

二、在公共區域建立線程執行個體,以便在關閉視窗的事件中調用

Thread thread = null;
private void Import_Click(object sender, RoutedEventArgs e)
{
thread=new Thread(new ThreadStart(DoSomething));                            
                            thread.Start();
 void DoSomething()
 {

 }
}
           

三、在關閉視窗的事件中,執行Abort方法

private void ImportWindow_Closed(object sender, EventArgs e)//該事件在視窗關閉後執行
        {
            if (thread != null)
            { thread.Abort(); }
        }
           

四、如果耗時任務的線程在try塊中執行,一定要添加一個catch(ThreadAbortException thAbortEx)塊,因為Abort方法是通過抛出一個ThreadAbortException異常來結束程序的。全部背景代碼如下

Thread thread = null;
        private void Import_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                thread = new Thread(new ThreadStart(DoSomething));
                thread.Start();
                void DoSomething()
                {

                }
            }
            catch(ThreadAbortException thAbortEx)
            {

            }
            catch (Exception ex)
            {

            }
            finally
            {

            }
        }
        private void ImportWindow_Closed(object sender, EventArgs e)//該事件在視窗關閉後執行
        {
            if (thread != null)
            { thread.Abort(); }
        }