簡體   English   中英

任務取消

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

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