簡體   English   中英

取消任務而不循環檢查取消令牌

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM