我试图使标题尽可能具体。基本上我现在在后台工作线程中运行的是一些看起来像这样的代码:
SqlConnection conn = new SqlConnection(connstring);
SqlCommand cmd = new SqlCommand(query, conn);
conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(cmd);
sda.Fill(Results);
conn.Close();
sda.Dispose();
其中 query 是一个字符串,表示一个大的、耗时的查询,conn 是连接对象。
我现在的问题是我需要一个停止按钮。我开始意识到杀死后台工作人员将毫无价值,因为我仍然想保留取消查询后剩余的结果。另外,直到查询之后,它才能检查取消状态。
到目前为止我想出了什么:
我一直在尝试概念化如何有效地处理这个问题而不会对性能造成太大影响。
我的想法是使用 SqlDataReader 一次从查询片段中读取数据,以便我有一个“循环”来检查我可以通过按钮从 GUI 设置的标志。问题是据我所知,我不能使用数据表的 Load() 方法,但仍然能够取消 sql 命令。如果我错了,请告诉我,因为这会使取消稍微容易一些。
根据我的发现,我意识到如果我执行以下操作(伪代码),我可能只能取消 sqlcommand 中间查询:
while(reader.Read())
{
//check flag status
//if it is set to 'kill' fire off the kill thread
//otherwise populate the datatable with what was read
}
然而,在我看来,这将是非常无效的并且可能代价高昂。这是杀死绝对需要在数据表中的 sqlcommand 的唯一方法吗?任何帮助,将不胜感激!