首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >终止任务的正确方法是什么?

终止任务的正确方法是什么?
EN

Stack Overflow用户
提问于 2017-05-26 10:38:20
回答 1查看 67关注 0票数 2

有一个关于立即终止任务的正确方法的问题。例如,我有以下代码:

代码语言:javascript
复制
public async Task<string> DoAsync()
{
    var result = await Task.Run(() =>
    {
        //Some heavy request here in a row (5 seconds per request)
        DoHeavyRequest(); // 1
        DoHeavyRequest(); // 2
        DoHeavyRequest(); // 3
        DoHeavyRequest(); // 4

        return "success";
    });

    return results;
}

我怎么能在一分钟内取消这项任务?例如,我运行了7秒的任务,我期望只调用第一次,可能是第二次“重请求”,3-4将根本不会被调用。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-26 10:47:26

我建议取消

代码语言:javascript
复制
public async Task<string> DoAsync(CancellationToken token) {
  var result = await Task.Run(() =>  {
    //TODO: you may want to pass token to DoHeavyRequest() and cancel there as well
    token.ThrowIfCancellationRequested();
    DoHeavyRequest(); // 1

    token.ThrowIfCancellationRequested();
    DoHeavyRequest(); // 2

    token.ThrowIfCancellationRequested();
    DoHeavyRequest(); // 3

    token.ThrowIfCancellationRequested();
    DoHeavyRequest(); // 4

    return "success";
  });

  return "results";
}

// Let's preserve the current interface - call without cancellation
public async Task<string> DoAsync() {
  return await DoAsync(CancellationToken.None);
}

..。

代码语言:javascript
复制
// Run, wait up to 7 seconds then cancel 
try {
  using (CancellationTokenSource cts = new CancellationTokenSource(7000)) {
    // Task completed, its result is in the result
    string result = await DoAsync(cts.Token);

    //TODO: Put relevant code here 
  }  
catch (TaskCanceledException) { 
  // Task has been cancelled (in this case by timeout)

  //TODO: Put relevant code here  
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44199443

复制
相关文章

相似问题

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