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