任务取消

本文关键字:取消 任务 | 更新日期: 2023-09-27 18:14:10

我正在寻找一种方法来取消已经启动的任务,然后用新的输入数据重新启动相同的任务。

下面是我写的示例代码,但它不工作。

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中进行手动检查,该方法将被异步执行,如下面的代码片段所示。我通常的做法是在方法本身开始时检查一次取消令牌源的状态。如果在此之前没有请求取消,那么就继续执行整个函数体。

但是没有人可以阻止你在你的方法中更关键的节点或里程碑进行检查,例如,你可能想在触发DB调用之前重新检查一次取消令牌状态。

注意事项:您只需要确保在方法执行期间多次进行此类检查并在中途返回时,您不会使对象的状态处于不一致状态。如果你没有在这样的方法中改变你的类的任何成员变量,那么你应该是好的。

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.
}