[英]Cancel a task without checking for cancellation token in a loop
我們留下下面的代碼:
Var task = Task.Run(() => RunTest(ct.Token));
Void RunTask(CancellationToken token)
{
If (!token.IsCancellationRequested)
}
Cmd.CommandText = code;
Cmd.ExecuteNonQuery();
}
}
現在這會取消正在運行的長時間運行的SQL查詢,如果請求取消,如何立即終止該任務並終止長時間運行的SQL查詢? 我知道有關“ Cancel()”的信息,但是如何基於cancellationToken觸發它?
如果您使用ExecuteNonQuery
則正在運行任務的線程正在其他人的代碼中的某個位置等待-您無法命令或執行其他工作。
但好消息是,您不需要成為現實。 只需改用ExecuteNonQueryAsync
並讓SqlCommand
對象本身處理取消即可。
async Task RunTask(CancellationToken token)
{
Cmd.CommandText = code;
await Cmd.ExecuteNonQueryAsync(token);
}
您可能還需要在此階段Unwrap
task
變量中的內容,因為它現在是Task<Task>
,通常,如果您完全感興趣,則您會對內部Task
何時完成感興趣。
或者,您可能要考慮是否Task.Run
需要Task.Run
。 這取決於為什么Task.Run
插入您的樣品在第一種情況和有多少實際活動RunTask
正在執行。
若要取消SqlCommand
,應使用SqlCommand.Cancel()
方法
在這里看看: https : //msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.cancel.aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.