好的,
这里似乎有很多关于 Thread.Abort() 有多可怕以及如何通过在循环中添加退出检查来解决在代码中使用 Thread.Abort() 的讨论。
这假设您控制工作的分区方式,其粒度足以遍历它。
但我该如何执行以下操作:
启动工作线程以执行某些操作,同时保持 UI 响应。出于所有意图和目的,工作线程的代码如下所示:
public override void Run() { try { _dataTable = ExecuteSingleGinormousSqlQuery(); } finally { // close the connection if it was left open. } }
具有“取消”按钮,以便用户在厌倦等待时可以中断此操作。
似乎除了 Thread.Abort() 之外没有其他解决方法。真的吗?此外,在实证测试中,Thread.Abort() 似乎甚至不会真正杀死线程,直到进行查询的调用为止,例如
new SqlDataAdapter(cmd).Fill( ds );
首先返回,因此显着否定了它的效用。
有解决办法吗?最佳做法?
最佳答案
SqlCommand 对象有一个 Cancel()您可以从另一个线程调用该方法以尝试取消正在运行的 SQL 查询。它不能保证成功,并且取决于数据库、驱动程序和实际运行的查询,但您可能会发现它可以满足您的需要。
关于c# - 使用单个巨大任务(例如 SQL 查询)杀死/中止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401532/