如何在ThreadPool中停止线程?

时间:2011-02-22 10:40:14

标签: c# multithreading threadpool

我开始一个长操作(通常是对数据库的长查询(SELECT))。 这可能需要很长时间,我想添加停止此操作的功能。 代码如下:

ThreadPool.QueueUserWorkItem(a => action.DoLongAction());

public void DoLongAction()
{
    var sql = Tables.Where(el => el.Some == "XXX"); // dynamically constructed LINQ query to database
    var result = db.Query(sql);
}

我无法使用标志信号来停止此线程。因为,长操作不在我的代码中,而是在数据库进程中(sql查询大约5分钟)。

如何正确停止此线程?

UPD1。不是普通的SQL,而是LINQ(EF4,BLToolkit)

4 个答案:

答案 0 :(得分:3)

考虑使用BackgroundWorker类。它支持取消。 但是,如果数据库提供程序支持取消查询,则只能以安全的方式取消查询。您的代码看起来不支持取消。

更新:经过一番讨论后,以下信息也值得回答:
SillaCommand支持Guillaume指出的取消,但使用的数据库驱动程序也需要支持它。所以最好的办法是: 使用SqlCommand或从它派生的类为您的DBMS,执行查询并尝试取消它并查看它是否受支持。如果不受支持,您将获得例外 如果支持,SqlCommand.Cancel的示例将帮助您实现所需的行为。

答案 1 :(得分:2)

如果要取消SQL命令,请查看SqlCommand.Cancel文档。

答案 2 :(得分:1)

如果您确实需要手动中止此线程,则可以使用Thread类。 有关如何使用它的详细信息,您可以查看此online resource

请注意,通常情况下,使用Thread.Abort();不是最佳做法,除非您要结束程序并希望终止所有正在运行的线程。

在您的情况下,当您尝试结束SQL查询时,您应该考虑其他方法来阻止它(SqlCommand.Cancel()ISession.CancelQuery(),...)

答案 3 :(得分:0)

您还可以为SQLCommand添加超时值。又名,如果没有完成,则在x秒后取消。