问题标签 [cancellationtokensource]

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 投票
2 回答
1190 浏览

c# - 检查是否使用 Moq 调用了 CancellationTokenSource.Cancel()

我有一个条件语句,应该如下所示:

其中 PermanentCancellation 是 CancellationTokenSource 类型。

我想知道我应该如何在我的 _view 模拟中设置它。到目前为止所有的尝试都失败了:(而且我在谷歌上找不到一个例子。

任何指针将不胜感激。

0 投票
1 回答
1704 浏览

c# - 验证模拟方法使用特定的 CancellationTokenSouce,该方法也被模拟

我试图验证特定的 CancellationTokenSource 是否用作方法调用中的实际参数。

以下是我的测试:

错误信息如下:

对模拟的预期调用至少一次,但从未执行:x => x.SetupCsvFileVerification(.entity.Object, (Object).source.Object.Token) 未配置任何设置。

source代表的类如下:

当我逐步完成单元测试时,cts 确实被分配了 TempCsvFileVerificationCancellation 的值。source 中的 Token 属性,返回 Source.Token。我不知道我做错了什么。

任何指针/帮助将不胜感激。

谢谢

编辑

0 投票
3 回答
2508 浏览

python - 在 Python 线程中模拟取消标记

我刚刚用 Python 写了一个任务队列,它的作用是限制一次运行的任务数量。这有点不同,Queue.Queue因为它不是限制队列中可以有多少项目,而是限制一次可以取出多少项目。它仍然使用 unboundedQueue.Queue来完成它的工作,但它依赖于 aSemaphore来限制线程数:

除非我明确停止任务队列,否则 Python 解释器将永远运行。这比我想象的要棘手得多。如果您查看该stop方法,您会看到我在队列上设置了一个canceled标志、release信号量和put一个无操作回调。最后两部分是必要的,因为代码可能会阻塞在SemaphoreQueue. 我基本上必须强迫这些通过,以便循环有机会爆发。

此代码有效。当运行一个试图并行运行数千个任务的服务时,这个类很有用。为了保持机器平稳运行并防止操作系统因过多的活动线程而尖叫,此代码将限制任何时间的线程数。

我之前用 C# 写过类似的代码块。使该代码特别“干”的原因是 .NET 有一个叫做 a 的东西CancellationToken,几乎每个线程类都使用它。任何时候有阻塞操作,该操作都需要一个可选的令牌。如果父任务被取消,任何使用该令牌阻塞的子任务也将立即被取消。与通过释放信号量或将值放入队列来“伪造”它相比,这似乎是一种更干净的退出方式。

我想知道在 Python 中是否有等效的方法?我绝对想使用线程而不是异步事件之类的东西。我想知道是否有一种方法可以使用两个Queue.Queues 来实现相同的事情,其中​​一个具有最大尺寸,而另一个没有 - 但我仍然不确定如何处理取消。

0 投票
0 回答
136 浏览

c# - 如何排队和取消多个事件?

假设我们有一个触发以下方法的事件:

您可以忽略该Name变量,因为原始对象是包含名称作为字符串和CancellationTokenSource. 据我了解,如果我在检测到之后ManualResetEvent.WaitOne()调用,我可以使用等待取消完成。如果我只有一个新事件要处理,这似乎工作正常。但是,如果我在当前进程取消时多次触发此事件,它现在会同时运行这两个事件。期望的结果是最近事件之前的所有事件都被取消并且处理在最近的事件上运行。ManualResetEvent.Set()cts.IsCancellationRequested == true

我怎样才能使这项工作?我在正确的轨道上吗?如果我可以提供任何其他信息来帮助回答这个问题,请告诉我。

0 投票
3 回答
5396 浏览

c# - 如何将 CancellationTokenSource 附加到 DownloadStringTaskAsync 方法并取消异步调用?

我创建了一个示例示例以使用 WebClient 使用 async 和 await 方法调用链接,现在我还想附加取消异步调用功能。但我无法获取 CancellationTokenSource 令牌并将 DownloadStringTaskAsync 附加到此取消令牌。以下是我的代码,任何人都可以告诉我如何做到这一点。

当我的取消按钮调用 cts.Cancel 时,DownloadStringTaskAsync 调用不会被取消。为什么取消按钮无法取消异步调用?

0 投票
5 回答
24248 浏览

c# - 为什么 CancellationToken 与 CancellationTokenSource 是分开的?

CancellationToken我正在寻找除了CancellationTokenSource类之外还引入.NET 结构的理由。我了解如何使用 API,但也想了解为什么要这样设计。

即,为什么我们有:

而不是像这样直接传递CancellationTokenSource

这是基于取消状态检查比传递令牌更频繁发生的事实的性能优化吗?

这样就CancellationTokenSource可以跟踪和更新CancellationTokens,并且对于每个令牌,取消检查都是本地字段访问?

鉴于在这两种情况下没有锁定的 volatile bool 就足够了,我仍然不明白为什么会更快。

谢谢!

0 投票
2 回答
5248 浏览

c# - CancellationTokenSource.Cancel 引发 ObjectDisposedException

我有一个拥有CancellationTokenSource.

我正在使用当前令牌开始一些长时间运行的操作。

我的对象还需要支持“回收”。想想轮回。必须取消在前一个生命周期中开始的所有长时间运行的操作。

在这种情况下,我调用CancelDispose源,并发出一个新的令牌源:

我在两个地方调用这个方法:当我希望令牌过期时和当这个类被释放时。

有时我会从我的方法中ObjectDisposedException调用 when 。文档说:_tokenSource.Cancel ()Dispose

的所有公共和受保护成员CancellationTokenRegistration都是线程安全的,并且可以从多个线程同时使用,除了Dispose,它只能在所有其他操作CancellationTokenRegistration都完成时使用。

我现在不知道该怎么办。包裹CancelToken在一个lock
竞争条件到底发生在哪里以及如何减轻它?

我确定它PrepareForReuse总是同一个线程上Dispose调用,但可能会在不同的线程上调用。

如果这有任何用处,我正在运行 Mono 而不是 .NET Framework,但我很确定它们在取消令牌方面应该具有相同的语义。

0 投票
1 回答
1747 浏览

c# - 为什么取消大量HTTP请求时取消阻塞这么长时间?

背景

我有一些代码使用来自一个特定主机的内容执行批处理 HTML 页面处理。它尝试使用HttpClient. 我相信同时连接的最大数量受 限制ServicePointManager.DefaultConnectionLimit,所以我没有应用我自己的并发限制。

将所有请求异步发送到HttpClientusingTask.WhenAll后,可以使用CancellationTokenSourceand取消整个批处理操作CancellationToken。通过用户界面可以查看操作的进度,并且可以单击按钮来执行取消。

问题

调用CancellationTokenSource.Cancel()阻塞大约 5 - 30 秒。这会导致用户界面冻结。怀疑发生这种情况是因为该方法正在调用注册取消通知的代码。

我所考虑的

  1. 限制并发 HTTP 请求任务的数量。我认为这是一种解决方法,因为HttpClient似乎已经将多余的请求本身排队。
  2. CancellationTokenSource.Cancel()在非 UI 线程中执行方法调用。这效果不太好。直到大多数其他任务完成后,该任务才真正运行。我认为async该方法的一个版本会很好用,但我找不到。另外,我觉得它适合在 UI 线程中使用该方法。

示范

代码

输出

控制台窗口显示取消阻止超过 13 秒

为什么取消阻止这么长时间?另外,有什么我做错了或者可以做得更好吗?

0 投票
0 回答
532 浏览

asp.net-mvc - 取消正在执行的动作

我有一个带有过滤器和 2 个按钮的页面:生成和取消。因此,当我单击“生成”按钮时,我会转到“结果”操作。当我单击取消按钮时,我想取消我之前在代码和数据库中的请求。

一些代码(我使用 .NET 4.0、MVC 4)

结果控制器.cs:

结果存储库.cs

所以,预期的结果:如果我取消报告生成请求应该被取消,没有数据显示。

主要问题:我可以使用方法 tokenSource.Cancel() 取消请求吗?或者我应该使用 ThrowIfCancellationRequested() 方法(在哪里?)

0 投票
2 回答
1273 浏览

c# - 具有 CancellationToken 的竞争条件,其中 CancellationTokenSource 仅在主线程上被取消

考虑一个 Winforms 应用程序,其中我们有一个生成一些结果的按钮。如果用户第二次按下按钮,它应该取消第一个生成结果的请求并开始一个新的请求。

我们正在使用以下模式,但我们不确定是否需要某些代码来防止竞争条件(请参阅注释掉的行)。

注意:

  • CancellationTokenSource我们只在主线程上取消。
  • 我们CancellationToken在 continuation 中使用与在原始任务中相同的方法。

我们想知道以下事件序列是否可能:

  1. 用户单击“生成结果”按钮。初始任务 t1 开始。
  2. 用户再次单击“生成结果”按钮。Windows 消息已发布到队列,但尚未执行处理程序。
  3. 任务 t1 完成。
  4. TPL开始 准备开始继续(因为CancellationToken尚未取消)。任务调度程序将工作发布到 Windows 消息队列(使其在主线程上运行)。
  5. 第二次单击的 generateResultsButton_Click 开始执行并被CancellationTokenSource取消。
  6. 延续工作开始,它就像令牌没有被取消一样运行(即它在 UI 中显示其结果)。

所以,我认为问题归结为:

当工作发布到主线程时(通过使用TaskScheduler.FromCurrentSynchronizationContext()),TPLCancellationToken在执行任务的操作之前检查主线程上的SynchronizationContext?