问题标签 [cancellation-token]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
10576 浏览

c# - 我可以使用 CancellationToken 取消 StreamReader.ReadLineAsync 吗?

Cancel()当我通过调用my的方法取消具有以下内容的异步方法时CancellationTokenSource,它将最终停止。但是,由于该行Console.WriteLine(await reader.ReadLineAsync());需要相当长的时间才能完成,因此我尝试将我CancellationToken的 toReadLineAsync()也传递给(期望它返回一个空字符串),以使该方法对我的Cancel()调用更具响应性。但是我无法通过CancellationTokento ReadLineAsync()

我可以取消通话吗Console.WriteLine()Streamreader.ReadLineAsync()如果可以,我该怎么做?

为什么ReadLineAsync()不接受一个CancellationToken?我认为给异步方法一个可选CancellationToken参数是一个好习惯,即使该方法在被取消后仍然完成。

更新:就像下面的评论中所述,Console.WriteLine()由于每行 40.000 个字符的格式错误的输入字符串,仅调用就已经占用了几秒钟。打破这个解决了我的响应时间问题,但我仍然对任何关于如何取消这个长时间运行的语句的建议或解决方法感兴趣,如果出于某种原因打算在一行中写入 40.000 个字符(例如,将整个字符串转储到一份文件)。

0 投票
1 回答
2404 浏览

c# - default(CancellationToken) 怎么会有对应的 CancellationTokenSource

当我创建一个默认值时CancellationToken,我可以在调试器中看到它CancellationToken有一个CancellationTokenSource与之关联的存储在私有m_source字段中:

不为空

我想知道对于结构来说,default关键字“将根据它们是值类型还是引用类型,将结构的每个成员初始化为零或null”并且CancellationTokenSource是引用类型。

CancellationToken确实有 2 个设置此字段的构造函数,但是它们不相关,因为default(CancellationToken)不调用构造函数并且new CancellationToken()(具有完全相同的行为)不调用构造函数,因为结构不能具有无参数构造函数(尚未)。

0 投票
4 回答
18322 浏览

c# - 链接取消令牌

我使用传递的取消令牌,以便可以干净地关闭我的服务。该服务具有不断尝试连接到其他服务的逻辑,因此令牌是打破在单独线程中运行的这些重试循环的好方法。我的问题是我需要调用具有内部重试逻辑的服务,但如果重试失败,则在设定的时间段后返回。我想创建一个带有超时的新取消令牌,这将为我做这件事。这样做的问题是我的新令牌没有链接到“主”令牌,所以当主令牌被取消时,我的新令牌仍然有效,直到它超时或建立连接并返回。我想做的是将两个令牌链接在一起,这样当主令牌被取消时,我的新令牌也将取消。我尝试使用CancellationTokenSource.CreateLinkedTokenSource方法但是当我的新令牌超时时,它也取消了主令牌。有没有办法用令牌做我需要做的事情,或者是否需要更改重试逻辑(可能无法轻松做到这一点)

这是我想做的事情:

Master Token - 传递各种功能,以便服务可以干净地关闭。临时令牌 - 传递给单个函数并在一分钟后设置为超时

如果主令牌被取消,临时令牌也必须被取消。

当临时令牌到期时,不得取消主令牌。

0 投票
1 回答
942 浏览

c# - 在任务执行委托中延迟取消支持的正确方法是什么?

我在 MSDN 或这里都没有看到任何关于如何实现这一点的具体提及。用例有点模糊,但我怀疑仍然有效。

上面的代码将尝试在 100 毫秒后取消task包含分离的子延迟任务的任务,并等待task完成,这将生成一个AggregateException(由于取消)。这样做的问题是它task变得有问题而不是被取消。这是预期的行为,因为延迟任务未附加到 parent task,即使两者共享相同的取消令牌。

我的问题特别与您将如何将 a 附加Task.Delay到已经运行的任务有关。如果您有权访问父任务,甚至可以这样做吗?如果不可能,或者不能访问父任务实例,那么处理这种情况的正确方法是什么?

我能想到的最好的解决方法是将延迟任务包装Wait在 try/finally 块中,并明确地尝试使任务取消冒泡。

虽然有效,但感觉不太对劲,但我不确定是否有更好的方法来实现这一点。期望的结果是父任务去Canceled而不是Faulted如果取消发生。因此,如果取消的起源发生在分离的子任务中,则父任务仍应转换为Canceled.

注意:我故意在这里省略了 async/await,只是因为它似乎并没有改变问题或结果。如果不是这种情况,请提供一个例子。

0 投票
2 回答
854 浏览

.net - .NET TPL CancellationToken 内存泄漏

我开发了一个库,它为工作项实现了生产者/消费者模式。工作被出列,并为每个出列的工作项启动一个单独的任务,其中包含失败和成功的延续。

任务继续在完成(或失败)其工作后重新排队工作项。

整个库共享一个 central CancellationTokenSource,在应用程序关闭时触发。

我现在面临重大的内存泄漏。如果任务是使用取消令牌作为参数创建的,那么这些任务似乎会保留在内存中,直到触发取消源(并在稍后处理)。

这可以在此示例代码 (VB.NET) 中重现。主要任务是包装工作项的任务,而后续任务将处理重新安排。

我使用 ANTS Memory Profiler 测量了内存使用情况,发现 System.Threading.ExecutionContext 大幅增加,这可以追溯到任务延续和CancellationCallbackInfo.

如您所见,我已经尝试处理使用取消令牌的任务,但这似乎没有效果。

编辑

我正在使用 .NET 4.0

更新

即使只是将主要任务与失败的延续联系起来,内存使用量也会不断增加。任务继续似乎阻止了取消令牌注册的注销。

因此,如果一个任务与一个没有运行的延续链接在一起(由于TaskContinuationOptions),那么似乎存在内存泄漏。如果只有一个继续运行,那么我没有观察到内存泄漏。

解决方法

作为一种解决方法,我可以在没有任何内容的情况下进行单个延续,TaskContinuationOptions并在那里处理父任务的状态:

如果取消,我将不得不检查它的执行情况,但这似乎可以解决问题。我几乎怀疑 .NET Framework 中存在错误。具有互斥条件的任务取消并不罕见。

0 投票
0 回答
349 浏览

vb.net - 带有超时取消请求的 VB.Net Task.WaitAll

我知道关于这个 arouynd 有一些线程和 atricles,但我似乎无法让它发挥作用。

基本上我有两个(或更多)任务要运行,但是有一个超时,在这个超时之后,我希望所有任务都取消,并且有办法知道我们已经超时,这样我就可以将它返回到我的网页。

这是我所拥有的:

cts.Cancel() 确实被调用了,因此它知道它花费了太长时间,但实际上并没有取消它,它只是继续执行直到任务完成。

我敢肯定这可能是我做错了一些简单的事情,但我无法发现它。

提前致谢。安迪

0 投票
3 回答
672 浏览

c# - 如何知道 CancellationToken 是否有注册的取消方法?

我有一个包含CancellationTokenSource. 该对象将其传递CancellationToken到与外部服务顺序通信的进程中。每当调用外部服务时,CancellationToken都会将其注册到一个允许进程停止等待外部服务响应的方法:

仅给定CancellationTokenSource,有没有办法知道已针对令牌注册了取消方法?

0 投票
3 回答
508 浏览

c# - 一旦一个完成的线程满足条件,如何取消其他线程

我有一个 ASP.NET MVC 应用程序,它需要检查 3 个远程 API 服务器上是否存在某些东西。应用程序将一个 ID 传递给每个 API,它返回 true 或 false。代码看起来像这样。

此代码当前异步检查所有 3 个 API,但将等到所有 HttpClient 调用完成后,MVC Action 才能返回。

一旦一个 API 返回 true,我想立即在 Action 上返回 true,而不是等待其他任务完成。

C# Task 类有 .WaitAll 和 .WaitAny,但它们也不起作用。由于我需要取消另一个 HttpClient 请求,我认为我需要使用 CancellationToken 但我不知道如何将它与这个结构一起使用。

干杯。

0 投票
1 回答
8128 浏览

c# - 为什么我在异步方法中调用 CancellationTokenSource 的 Cancel 方法时任务没有取消?

CancellationToken我在and周围创建了一个小包装器CancellationTokenSource。我遇到的问题是 的CancelAsync方法CancellationHelper没有按预期工作。

我遇到了该ItShouldThrowAExceptionButStallsInstead方法的问题。要取消正在运行的任务,它会调用await coordinator.CancelAsync();,但该任务实际上并未取消,也不会引发异常task.Wait

ItWorksWellAndThrowsException似乎运行良好并且它使用coordinator.Cancel,这根本不是异步方法。

CancellationTokenSource当我在异步方法中调用 Cancel 方法时,为什么任务没有被取消?

不要让waitHandle你迷惑,这只是为了不让任务提前完成。

让代码自己说话:

0 投票
2 回答
997 浏览

c# - 如何通过 Escape 键正确取消并行异步 IO 任务?

我正在学习异步等待操作,并发现了一篇非常有用的文章

我考虑这篇文章的最后一个代码片段:

我尝试了一些代码来取消任务,但是,恕我直言,这些都是非常丑陋的尝试。在此尝试中,我的程序流程等待用户按键,但我希望此代码能够工作,直到用户按下 Esc 按钮,如事件:

如何通过 Escape 键正确取消?

更新:

我已经插入了这段代码:

但是,此代码不会取消方法ProcessWriteMult(cts)。我究竟做错了什么?