【问题标题】:How can I cancel a Task without LOOP如何在没有 LOOP 的情况下取消任务
【发布时间】:2014-06-20 01:08:35
【问题描述】:

您好,我在论坛上阅读了很多,但我无法找到我的问题的答案...

这是我想要在布尔值变为 TRUE 时取消的函数:

Task<PortalODataContext> task = Task.Factory.StartNew(() =>
        {
            var context = connection.ConnectToPortal();
            connection.ListTemplateLib = this.ShellModel.ConnectionManager.GetTemplateLibrarys(connection);
            connection.ListTemplateGrp = this.ShellModel.ConnectionManager.GetTemplateGroups(connection, connection.TemplateLibraryId);
            connection.ListTemplates = this.ShellModel.ConnectionManager.GetTemplates(connection, connection.TemplateGroupId);
            return context;
       }, token);

如何验证令牌是否收到了没有 LOOP 的取消请求?

类似的东西:

if (token.IsCancellationRequested)
{
    Console.WriteLine("Cancelled before long running task started");
    return;
}

for (int i = 0; i <= 100; i++)
{
    //My operation

    if (token.IsCancellationRequested)
    {
        Console.WriteLine("Cancelled");
        break;
    }
}

但我没有需要循环的操作,所以我不知道该怎么做......

【问题讨论】:

  • 你为什么不添加循环,以便我们按照你的思路。
  • 在每次精细操作后测试取消

标签: c# async-await cancellation-token


【解决方案1】:

我假设tokenCancellationToken

您不需要循环,而是查看CancellationToken.ThrowIfCancellationRequested。通过调用它,CancellationToken 类将检查它是否已被取消,并通过抛出异常终止任务。

你的任务代码会变成这样的:

using System.Threading.Tasks;
Task.Factory.StartNew(()=> 
{
    // Do some unit of Work
    // .......

    // now check if the task has been cancelled.
    token.ThrowIfCancellationRequested();

    // Do some more work
    // .......

    // now check if the task has been cancelled.
    token.ThrowIfCancellationRequested();
}, token);

如果抛出取消异常,则从Task.Factory.StartNew 返回的任务将设置其IsCanceled 属性。如果您使用的是 async/await,则需要捕获 OperationCanceledException 并适当地进行清理。

查看 MSDN 上的 Task Cancellation 页面了解更多信息。

【讨论】:

  • 所以我需要验证令牌是否在每行之后被取消?
  • 在每个有意义的工作单元之后取消,是的。这可能是单个方法调用或一组方法调用。对于您发布的示例,我会在每个 ConnectionManager 调用之前进行检查。它并不总是每一行代码。
猜你喜欢
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2018-07-09
相关资源
最近更新 更多