我开始一个长操作(通常是对数据库的长查询(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)
答案 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秒后取消。