问题标签 [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 回答
3567 浏览

c# - 取消令牌停止如何继续?

我有一个带有此代码的线程:

请注意,我使用return而不是break,因为如果我停止线程,则some operation 2不能执行。

我还注意到,以这种方式 .ContinueWith 它不会被执行。

好吧,但这只是一个“返回”功能。C# 怎么知道我是因为返回而tokenSource.Cancel()不是通常返回而返回?

0 投票
1 回答
191 浏览

c# - 如果条件满足,ParallelFor 不会立即取消所有线程

代码总是等到当前正在运行的任务完成后再OperationCancelledException抛出。

我希望程序在条件为真时立即停止。

cts.Cancel()我发现在 catch 中设置断点可以显示正在发生的事情。

也看过state.Stop

这是其他代码的简化版本。

Parallel.For如果我们想立即突破,也许对于在方法中运行很长时间的事情并不理想。

更新 2: 代码现在按预期工作并给出了一个很好的总数

0 投票
1 回答
1652 浏览

c# - 来自 async/await、CancellationTokenSource、Threading.Timer 组合的死锁

在为任意可取消代码编写包装器的过程中,该代码应该在某个条件成立时运行(必须定期验证),我在 、 和 / 生成的代码之间的交互中遇到了CancellationTokenSource有趣Threading.Timerasync行为await

简而言之,它看起来是,如果您有一些可取消Task的等待,然后您TaskTimer回调中取消它,则取消任务之后的代码将作为取消请求本身的一部分执行。

在下面的程序中,如果添加跟踪,您将看到Timer调用中回调块的执行cts.Cancel(),并且被该调用取消的等待任务之后的代码与cts.Cancel()调用本身在同一个线程中执行。

下面的程序正在执行以下操作:

  1. 为取消我们要模拟的工作创建取消令牌源;
  2. 创建计时器,用于在工作开始后取消工作;
  3. 程序计时器从现在开始 100 毫秒;
  4. 开始说工作,只是空转200ms;
    • 计时器回调启动,取消Task.Delay“工作”,然后休眠 500 毫秒以证明计时器处理等待此;
  5. 验证工作是否按预期取消;
  6. 清理计时器,确保在此之后计时器不会被调用,并且如果它已经在运行,我们会在此处阻塞等待它完成(假设之后有更多工作如果计时器回调正在运行则无法正常工作同时)。

当我第一次编写它时,我期望它能够工作的最简单方法是使用cts.CancelAfter(0)而不是cts.Cancel(). 根据文档,cts.Cancel()将同步运行任何注册的回调,我的猜测是,在这种情况下,与async/await生成代码的交互,在取消发生点之后的所有代码都作为其中的一部分运行。cts.CancelAfter(0)将这些回调的执行与其自身的执行分离。

有没有人遇到过这个?在这种情况下,cts.CancelAfter(0)避免死锁的最佳选择是什么?

0 投票
1 回答
15876 浏览

c#-4.0 - 错误:操作已取消

我正在使用此代码片段执行带有取消令牌的异步查询:

但是,当操作被取消时,cancellationToken.ThrowIfCancellationRequested();会引发异常。我知道这条线应该是这个东西。但是,在开发环境中,异常会导致视觉工作室中断。我怎样才能避免这种情况?

0 投票
1 回答
1814 浏览

c# - 在没有 ThrowIfCancellationRequested 的情况下停止任务

我有一个要取消的任务。

执行此操作的常规方法是使用CancellationToken.

然而,在现实世界中,事情从来没有那么简单。我们的异步代码不能循环,它看起来像这样:

我对对象和方法名称使用了随机数来表明不能创建任何循环。

最困扰的是我必须CancelToken.ThrowIfCancellationRequested()一遍又一遍地写同样的东西。

而且,好像这还不够,我必须CancellationToken在我的代码中拖动所有内容,以便能够在正确的时间停止长时间运行的操作 - 根据微软的说法。

话虽如此,有没有办法可以免除这些毒害我的代码的重复调用?

我们也知道,当使用

anOperationCancelledException被抛出并捕获该Wait方法。CancelToken.ThrowIfCancellationRequested()但是,如果时不时没有检查,任务执行的长时间操作不会停止。

当异常被捕获等待时,有什么办法可以使内部操作停止?

0 投票
1 回答
1663 浏览

c# - 在 IIS 上挂起在重负载下的服务器取消的请求

我面临一个难以重现的问题,我认为这与使用CancellationToken. 我有三个异步应用程序(每个都在不同的服务器上),它们通过 ASP.NET Web API 进行通信,如下图所示

AppA不时运行一个例程,该例程向 app 触发大量并发请求B,这反过来又向 app 触发另一批并发请求C。所有这些调用都是使用 完成的HttpClient.SendAsync,并且被限制为 10 秒超时,使用CancellationToken如下:

当服务器C负载过重时,它开始花费更多时间来响应,这导致服务器B开始取消请求——因为配置了超时。发生这种情况时,有时请求会“卡住”(见下图)。

在此处输入图像描述

我熟悉 C# 异步最佳实践,但我不做.Result.Wait()类的。我知道这些可能会导致挂起。

如果我通过CancellationToken.None了,问题就消失了,所以我的提示是它与高并发情况下的取消有关。

随着时间的流逝,越来越多的请求开始挂起,最终我别无选择,只能重置 IIS 以使它们消失。

任何可能发生的事情的线索?

0 投票
0 回答
259 浏览

c# - 在 C# 中取消长时间运行的任务

我正在做一个项目,我们有很多单独的组件正在运行,我的议程是根据用户输入取消中间的组件进程。

例如:我有 6 个 Windows 服务来完成所有工作,还有 1 个 Windows 服务负责分配工作。所以一旦工作被发送到工作窗口服务,就无法控制它。这个工作窗口服务做一些耗时的任务,调用几个函数,与数据库交互等。我想取消工作之间的任务。

我们用于取消的传统方法将不再适用于... 1. 我没有迭代任何可以持续检查取消标志的循环。2. 由于组件是完全独立的,一旦它们开始工作,就会创建该组件的新实例,并且无法将任何值传递给该组件。

提前致谢。

0 投票
5 回答
27813 浏览

c# - 如何在 .NET 4.0 中请求超时或取消之前“休眠”

睡一定时间但又能被 a 打断的最好方法是IsCancellationRequested什么CancellationToken

我正在寻找适用于 .NET 4.0 的解决方案。

我想写

0 投票
1 回答
2741 浏览

c# - task IsCanceled is false, while I canceled

When I cancel a Task, the await result still returns true for the IsCanceled Property. Seems something is going wrong.

Please advise. This is the code:

When I hit the CancelButton and therefore trigger the CancelButton_Click method, the CallBack method is triggered. But... when I check myTaskToWaitFor.IsCanceled is always returns false and I get this info: Id = 1, Status = RanToCompletion, Method = "{null}". Why is the status not Cancelled or something?

When I use http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.throwifcancellationrequested.aspx

like this:

I only get some errors in debug mode and the it seems the myTaskToWaitFor is actually cancelled, but the code doesn't continue (on continue the program is shut down due to the exception). Any thoughts? Kind regards,

Matthijs

Edit:

test with the TrowIfCancellationRequested was based on "When you call ThrowIfCancellationRequested on a CancellationToken which is canceled, it will throw an OperationCanceledException. The Task Parallel Library knows that this type of exception represents cancellation rather than a failure, and will treat it differently. For example, Task has a property called IsCanceled that automatically becomes true when an OperationCanceledException is thrown while executing an async method." From the book Async in C# 5.0 by Alex Davies.

That's why I thought I could expect myTaskToWaitFor.IsCancelled to return true and the code would continue.

0 投票
1 回答
620 浏览

c# - Parallel.Foreach/For 如何调用 BlockingCollection.Take?有或没有 CancellationToken

Parallel.Foreach/For 是否调用 BlockingCollection1.Take 函数有或没有我放入 ParallelOptions 的 CancellationToken?

有机会知道吗?