[英]Task Cancellation
我正在尋找一種方法來取消已經啟動的任務,然后使用新的輸入數據重新啟動相同的任務。
下面是我編寫的示例代碼,但它不起作用。
private CancellationTokenSource _cancellationTokenSource;
public public async Task DoSomething(string input)
{
_cancellationTokenSource.Cancel(true);
_cancellationTokenSource = new CancellationTokenSource();
try
{
Task.Run(async () =>
{
//Asynchronous method code here which uses input like database operations.
await doSomeDataBaseOperationAsync(input);
}, _cancellationTokenSource.Token);
}
catch { }
}
有人可以幫我嗎?
您需要在方法doSomeDataBaseOperationAsync
進行手動檢查,該方法將異步執行,如下面的代碼片段所示。 我通常采用的方法是在方法本身啟動時檢查取消令牌源的狀態。 如果在此之前沒有請求取消,那么請繼續執行整個功能體。
但是沒有人可以阻止你在方法中更關鍵的接合點或里程碑進行檢查,例如你可能想要在解雇數據庫調用之前重新檢查取消令牌狀態一次。
注意事項 :您只需確保無論何時在執行方法期間多次進行此類檢查並返回中途,您都不會使對象的狀態處於不一致狀態。 如果你不用這種方法改變你班級的任何成員變量那么你應該是好的。
private void doSomeDataBaseOperationAsync(input)
{
if (_cancellationTokenSource.IsCancellationRequested)
return; //stop any further processing.
//do some processing and calculations on the client side
//.....
//.....
//.....
//make a check again before firing DB request
if (_cancellationTokenSource.IsCancellationRequested)
return; //stop any further processing.
//Do database stuff. cancellation has not been requested. Process the DB request.
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.