【问题标题】:Cancel a task without checking for cancellation token in a loop取消任务而不在循环中检查取消令牌
【发布时间】:2016-03-08 11:09:18
【问题描述】:

让我们留下以下代码:

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

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

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

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

【问题讨论】:

标签: c# task


【解决方案1】:

如果您使用 ExecuteNonQuery,那么您的任务正在运行的线程正在其他人的代码中等待 - 您无法使用它来征用和做其他工作。

但好消息是,您不需要这样。只需改用ExecuteNonQueryAsync 并让SqlCommand 对象自行处理取消。

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

在这个阶段你可能还想Unwraptask 变量中的内容,因为它现在是Task<Task>,通常,如果你有兴趣,你会对内部@ 987654330@已完成。

或者您可能需要考虑是否需要Task.Run。这取决于在第一种情况下为什么将Task.Run 插入到您的样本中,以及RunTask 正在执行多少实际活动。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    猜你喜欢
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2021-12-17
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多