c# - 使用单个巨大任务(例如 SQL 查询)杀死/中止线程

标签 c# .net multithreading

好的,

这里似乎有很多关于 Thread.Abort() 有多可怕以及如何通过在循环中添加退出检查来解决在代码中使用 Thread.Abort() 的讨论。

这假设您控制工作的分区方式,其粒度足以遍历它。

但我该如何执行以下操作:

  1. 启动工作线程以执行某些操作,同时保持 UI 响应。出于所有意图和目的,工作线程的代码如下所示:

    public override void Run()
    {
        try
        {
            _dataTable = ExecuteSingleGinormousSqlQuery();
        } finally
        {
            // close the connection if it was left open.
        }
    }
    
  2. 具有“取消”按钮,以便用户在厌倦等待时可以中断此操作。

似乎除了 Thread.Abort() 之外没有其他解决方法。真的吗?此外,在实证测试中,Thread.Abort() 似乎甚至不会真正杀死线程,直到进行查询的调用为止,例如

    new SqlDataAdapter(cmd).Fill( ds );

首先返回,因此显着否定了它的效用。

有解决办法吗?最佳做法?

最佳答案

SqlCommand 对象有一个 Cancel()您可以从另一个线程调用该方法以尝试取消正在运行的 SQL 查询。它不能保证成功,并且取决于数据库、驱动程序和实际运行的查询,但您可能会发现它可以满足您的需要。

关于c# - 使用单个巨大任务(例如 SQL 查询)杀死/中止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1401532/

相关文章:

java - Scala 中线程执行器池的替代品

java - java 8中是否存在并发时发生的liveness failure

c# - Nancy Self Host 使用 Razor View 的空白响应

.net - 从 String 到 Date 类型的转换无效错误

python - 如何并行合并两个 Pandas 数据框(多线程或多处理)

c# - Object.GetType() 的性能

c# - 为什么我可以将无效值解析为 .NET 中的枚举?

c# - 找不到文件,但文件在那里!

c# - 条件变量值

c# - Haskell 中的 OOP 样式继承