【发布时间】: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