取消任务而不在循环中检查取消令牌

时间:2016-03-08 11:09:19

标签: c# task

让我们留下以下代码:

Var task = Task.Run(() => RunTest(ct.Token));

Void RunTask(CancellationToken token)
{
If (!token.IsCancellationRequested)
}

 Cmd.CommandText = code;
 Cmd.ExecuteNonQuery();
}
}

现在取消正在运行的长时间运行的SQL查询,如果请求取消,如何终止长时间运行的SQL查询,如何立即终止任务?我知道'取消()',但我如何根据cancellationToken触发它?

2 个答案:

答案 0 :(得分:3)

如果您使用ExecuteNonQuery,则运行您的任务的线程正在某个人的代码中等待 - 您无法使用此命令并执行其他工作。

但好消息是,你不需要它。只需使用ExecuteNonQueryAsync,让SqlCommand对象自行处理取消。

async Task RunTask(CancellationToken token)
{
  Cmd.CommandText = code;
  await Cmd.ExecuteNonQueryAsync(token);
}

您可能还想Unwraptask变量中的Task<Task>变量,因为它现在是Task而且通常,如果您对此感兴趣,那么您将是感兴趣内部Task.Run何时完成。

或者您可能想要考虑是否需要Task.Run。这取决于在第一种情况下RunTask插入到您的示例中的原因以及实际活动<div class="source"> <a href="#"><h3>source</h3></a> </div> <div class="share"> <h3>share</h3> </div> <div class="share"> <h3>tweet</he> </div> 的执行情况。

答案 1 :(得分:0)

要取消SqlCommand,您应该使用SqlCommand.Cancel()方法

看看这里:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.cancel.aspx

相关问题