【问题标题】:Cancel an internal task using CancellationToken in ASP.NET Core2.2在 ASP.NET Core2.2 中使用 CancellationToken 取消内部任务
【发布时间】:2019-11-08 19:22:18
【问题描述】:

我有一个包含无限循环的方法。我从 main 方法调用该方法,如果需要超过 2 秒,我想取消它。 我尝试了这些方法

Task.WhenAny with cancellation of the non completed tasks and timeout

How can I cancel Task.WhenAll?

How to cancel a task using a CancellationToken and await Task.WhenAny

还有很多其他链接,但没有工作。 这是我的代码

static void Main(string[] args)
{
   var cts = new CancellationTokenSource(2000);   
   var task = Task.Run(() => RunTask(), cts.Token);
   await task;
}

public static void RunTask()
{
   while (true)
   {
     Console.WriteLine("in while");
   }
}

我也尝试取消我的令牌,但没有成功。 无法处置task。 我无权访问RunTask 源代码。我只能运行它。 我无法将CancellationToken 发送到我的方法。如何终止RunTask() 方法?

【问题讨论】:

  • 为什么不能发送令牌到你的方法?
  • 因为我无权访问该源代码。用户可以来编写自己的代码。
  • 我不明白。如果您无法控制正在执行的代码,那么您需要更高级别的隔离 - 在进程中执行它。否则,你会有很大的问题。
  • 我想在一个任务中运行它,如果它需要超过 x 秒或毫秒,我会取消它。我认为这是CancellationToken的主要概念。
  • CancellationToken 是协作的:它建议任务完成其工作。但任务可以简单地忽略它。因此,如果用户可以编写他们想要的任何内容,那么您就不能依赖他们来考虑 CancellationCoken。你根本做不到。那么你需要采取更严厉的措施。

标签: c# asp.net-core .net-core cancellationtokensource cancellation-token


【解决方案1】:

取消令牌是一种请求取消的方式。由正在运行的代码来接受该请求并实际停止工作。这不像杀死一个进程。例如,如果你有类似的东西:

public static void RunTask(CancellationToken cancellationToken)
{
   while (!cancellationToken.IsCancellationRequested)
   {
     Console.WriteLine("in while");
   }
}

然后,当它被取消时,循环将结束。但是,鉴于当前代码没有提供任何取消的方法,并且您无法修改它,因此无法取消它。

【讨论】:

  • 谢谢。你是完全正确的。但我无法使用该方法将CancellationToken 放入其中。
  • 这意味着你运气不好。无法取消。
【解决方案2】:

这种方法怎么样:

static void Main(string[] args)
{
   var cts = new CancellationTokenSource(2000);   
   var task = Task.Run(() => RunTask(cts.Token), cts.Token);
   await task;
}

public static void RunTask(CancellationToken token)
{
   while (!token.IsCancellationRequested)
   {
     Console.WriteLine("in while");
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多