首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任务取消

任务取消
EN

Stack Overflow用户
提问于 2016-10-20 10:37:54
回答 1查看 335关注 0票数 1

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

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

代码语言:javascript
复制
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 { }
}

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-20 11:00:46

您需要对方法doSomeDataBaseOperationAsync进行手动检查,该方法是异步执行的,如下面的代码片段所示。我通常的做法是在方法本身的开始时检查取消令牌源的状态。如果直到那个时候才请求取消,那么就继续执行整个函数体。

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

警告词:您只需要确保在执行方法和中途返回时,无论何时进行这样的检查,都不会使对象的状态处于不一致的状态。如果您没有在这样的方法中更改类的任何成员变量,那么您应该是好的。

代码语言:javascript
复制
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.
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40152046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档