我有一個線程出去查找我們的(舊)SQL服務器上的數據。如何殺死一個C#線程?
隨着數據的進入,我發佈信息到一個模式對話框 - 用戶不能做任何事情,而所有這些處理都在進行。模態對話框只是爲了讓他們看到我正在做一些事情,並阻止他們同時運行另一個查詢。
有時(很少),當代碼調用SQL服務器時,服務器不響應(IT維護人員維護它,LAN線路被切斷或PC不在網絡中)或者做查詢的人用完了時間。所以,模式對話框確實有一個取消按鈕。
線程對象(System.Threading.Thread)具有IsBackground=true
。
當用戶點擊取消,我打電話給我的KillThread
方法。
注意:我不能在該類中使用BackgroundWorker組件,因爲它與一些Windows Mobile 5代碼共享& WM5沒有BackgroundWorker。
void KillThread(Thread th) {
if (th != null) {
ManualResetEvent mre = new ManualResetEvent(false);
Thread thread1 = new Thread(
() =>
{
try {
if (th.IsAlive) {
//th.Stop();
// 'System.Threading.Thread' does not contain a definition for 'Stop'
// and no extension method 'Stop' accepting a first argument of type
// 'System.Threading.Thread' could be found (are you missing a using
// directive or an assembly reference?)
th.Abort();
}
} catch (Exception err) {
Console.WriteLine(err);
} finally {
mre.Set();
}
}
);
string text = "Thread Killer";
thread1.IsBackground = true;
thread1.Name = text;
thread1.Start();
bool worked = mre.WaitOne(1000);
if (!worked) {
Console.WriteLine(text + " Failed");
}
th = null;
}
}
在我的輸出窗口,我總是看到「主題殺手失敗」,但沒有異常丟進。
我應該如何停止一個線程?
最好相關的帖子,我發現其中兩個以下:
How to Kill Thread in C#?
How to kill a thread instantly in C#?
編輯:
似乎有一些混亂與方法我列在上面。
首先,當有人點擊取消按鈕,這個程序被調用:
void Cancel_Click(object sender, EventArgs e) {
KillThread(myThread);
}
接下來,當我去殺死一個線程,我寧願沒有永遠等待線程停止。同時,如果線程仍處於活動狀態,我不想讓代碼繼續。所以,我使用了一個ManualResetEvent
對象。它不應該需要一整秒(1000毫秒)只是爲了停止線程,但每次WaitOne
方法超時。
還在聽的想法。
我要編輯我的帖子。我想我已經寫錯了。 – jp2code 2011-02-17 21:21:15
這裏的觀點(和MarcelDevG指出的一樣)是你不要殺死一個線程。線程應該優雅地退出並自行清理。 – 2011-02-17 21:45:50
這將是一個想法。但是,我無法告訴我們的SQL Server 2000停止查詢。我想我可以簡單地放棄線程(將其設置爲NULL,然後在執行下一個查詢時創建一個新實例),但我想知道如何停止線程。 – jp2code 2011-02-17 22:06:56