我有一个线程出去查找我们的(旧)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