问题标签 [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.
c# - 取消令牌停止如何继续?
我有一个带有此代码的线程:
请注意,我使用return
而不是break
,因为如果我停止线程,则some operation 2
不能执行。
我还注意到,以这种方式 .ContinueWith 它不会被执行。
好吧,但这只是一个“返回”功能。C# 怎么知道我是因为返回而tokenSource.Cancel()
不是通常返回而返回?
c# - 如果条件满足,ParallelFor 不会立即取消所有线程
代码总是等到当前正在运行的任务完成后再OperationCancelledException
抛出。
我希望程序在条件为真时立即停止。
cts.Cancel()
我发现在 catch 中设置断点可以显示正在发生的事情。
也看过state.Stop
。
这是其他代码的简化版本。
Parallel.For
如果我们想立即突破,也许对于在方法中运行很长时间的事情并不理想。
更新 2: 代码现在按预期工作并给出了一个很好的总数
c# - 来自 async/await、CancellationTokenSource、Threading.Timer 组合的死锁
在为任意可取消代码编写包装器的过程中,该代码应该在某个条件成立时运行(必须定期验证),我在 、 和 / 生成的代码之间的交互中遇到了CancellationTokenSource
有趣Threading.Timer
的async
行为await
。
简而言之,它看起来是,如果您有一些可取消Task
的等待,然后您Task
从Timer
回调中取消它,则取消任务之后的代码将作为取消请求本身的一部分执行。
在下面的程序中,如果添加跟踪,您将看到Timer
调用中回调块的执行cts.Cancel()
,并且被该调用取消的等待任务之后的代码与cts.Cancel()
调用本身在同一个线程中执行。
下面的程序正在执行以下操作:
- 为取消我们要模拟的工作创建取消令牌源;
- 创建计时器,用于在工作开始后取消工作;
- 程序计时器从现在开始 100 毫秒;
- 开始说工作,只是空转200ms;
- 计时器回调启动,取消
Task.Delay
“工作”,然后休眠 500 毫秒以证明计时器处理等待此;
- 计时器回调启动,取消
- 验证工作是否按预期取消;
- 清理计时器,确保在此之后计时器不会被调用,并且如果它已经在运行,我们会在此处阻塞等待它完成(假设之后有更多工作如果计时器回调正在运行则无法正常工作同时)。
当我第一次编写它时,我期望它能够工作的最简单方法是使用cts.CancelAfter(0)
而不是cts.Cancel()
. 根据文档,cts.Cancel()
将同步运行任何注册的回调,我的猜测是,在这种情况下,与async
/await
生成代码的交互,在取消发生点之后的所有代码都作为其中的一部分运行。cts.CancelAfter(0)
将这些回调的执行与其自身的执行分离。
有没有人遇到过这个?在这种情况下,cts.CancelAfter(0)
避免死锁的最佳选择是什么?
c#-4.0 - 错误:操作已取消
我正在使用此代码片段执行带有取消令牌的异步查询:
但是,当操作被取消时,cancellationToken.ThrowIfCancellationRequested();
会引发异常。我知道这条线应该是这个东西。但是,在开发环境中,异常会导致视觉工作室中断。我怎样才能避免这种情况?
c# - 在没有 ThrowIfCancellationRequested 的情况下停止任务
我有一个要取消的任务。
执行此操作的常规方法是使用CancellationToken
.
然而,在现实世界中,事情从来没有那么简单。我们的异步代码不能循环,它看起来像这样:
我对对象和方法名称使用了随机数来表明不能创建任何循环。
最困扰的是我必须CancelToken.ThrowIfCancellationRequested()
一遍又一遍地写同样的东西。
而且,好像这还不够,我必须CancellationToken
在我的代码中拖动所有内容,以便能够在正确的时间停止长时间运行的操作 - 根据微软的说法。
话虽如此,有没有办法可以免除这些毒害我的代码的重复调用?
我们也知道,当使用
anOperationCancelledException
被抛出并捕获该Wait
方法。CancelToken.ThrowIfCancellationRequested()
但是,如果时不时没有检查,任务执行的长时间操作不会停止。
当异常被捕获等待时,有什么办法可以使内部操作停止?
c# - 在 IIS 上挂起在重负载下的服务器取消的请求
我面临一个难以重现的问题,我认为这与使用CancellationToken
. 我有三个异步应用程序(每个都在不同的服务器上),它们通过 ASP.NET Web API 进行通信,如下图所示
AppA
不时运行一个例程,该例程向 app 触发大量并发请求B
,这反过来又向 app 触发另一批并发请求C
。所有这些调用都是使用 完成的HttpClient.SendAsync
,并且被限制为 10 秒超时,使用CancellationToken
如下:
当服务器C
负载过重时,它开始花费更多时间来响应,这导致服务器B
开始取消请求——因为配置了超时。发生这种情况时,有时请求会“卡住”(见下图)。
我熟悉 C# 异步最佳实践,但我不做.Result
之.Wait()
类的。我知道这些可能会导致挂起。
如果我通过CancellationToken.None
了,问题就消失了,所以我的提示是它与高并发情况下的取消有关。
随着时间的流逝,越来越多的请求开始挂起,最终我别无选择,只能重置 IIS 以使它们消失。
任何可能发生的事情的线索?
c# - 在 C# 中取消长时间运行的任务
我正在做一个项目,我们有很多单独的组件正在运行,我的议程是根据用户输入取消中间的组件进程。
例如:我有 6 个 Windows 服务来完成所有工作,还有 1 个 Windows 服务负责分配工作。所以一旦工作被发送到工作窗口服务,就无法控制它。这个工作窗口服务做一些耗时的任务,调用几个函数,与数据库交互等。我想取消工作之间的任务。
我们用于取消的传统方法将不再适用于... 1. 我没有迭代任何可以持续检查取消标志的循环。2. 由于组件是完全独立的,一旦它们开始工作,就会创建该组件的新实例,并且无法将任何值传递给该组件。
提前致谢。
c# - 如何在 .NET 4.0 中请求超时或取消之前“休眠”
睡一定时间但又能被 a 打断的最好方法是IsCancellationRequested
什么CancellationToken
?
我正在寻找适用于 .NET 4.0 的解决方案。
我想写
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?
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.
c# - Parallel.Foreach/For 如何调用 BlockingCollection.Take?有或没有 CancellationToken
Parallel.Foreach/For 是否调用 BlockingCollection1.Take 函数有或没有我放入 ParallelOptions 的 CancellationToken?
有机会知道吗?