问题标签 [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# - CancellationTokenSource 与 volatile 布尔值
在 volatile布尔字段上使用CancellationTokenSource来指示 a完成有什么好处吗?Task
c# - 带有 CancellationToken 的异步/等待不会取消操作
我想使用CancellationToken
中止文件下载。这是我尝试过的:
然后应使用cancelToken取消操作:
好像IsCancellationRequested
没有更新。所以操作不会被取消。我也试过用这个
但没有任何改变。
我做错了什么?
编辑:
以下是缺少的部分,例如GetDocumentById
:
c# - 如何取消并发的繁重任务?
我有一个繁重的进程在其体内运行的任务。此外,我们无法访问此方法的主体(繁重的进程),我们必须等到完成该进程。
现在我的问题是,如何在不中断任务的情况下取消,以便不检查其中的任何值?
我的代码是这样的:
运行后我可以取消繁重的过程吗?
vb.net - 带有超时取消请求的 VB.Net Task.WaitAll
我知道关于这个 arouynd 有一些线程和 atricles,但我似乎无法让它发挥作用。
基本上我有两个(或更多)任务要运行,但是有一个超时,在这个超时之后,我希望所有任务都取消,并且有办法知道我们已经超时,这样我就可以将它返回到我的网页。
这是我所拥有的:
cts.Cancel() 确实被调用了,因此它知道它花费了太长时间,但实际上并没有取消它,它只是继续执行直到任务完成。
我敢肯定这可能是我做错了一些简单的事情,但我无法发现它。
提前致谢。安迪
c# - 如何知道 CancellationToken 是否有注册的取消方法?
我有一个包含CancellationTokenSource
. 该对象将其传递CancellationToken
到与外部服务顺序通信的进程中。每当调用外部服务时,CancellationToken
都会将其注册到一个允许进程停止等待外部服务响应的方法:
仅给定CancellationTokenSource
,有没有办法知道已针对令牌注册了取消方法?
c# - 如何使用 CancellationToken 安全地取消任务并等待 Task.WhenAll
我有一个框架,它创建一个 CancellationTokenSource,配置 CancelAfter,然后调用一个异步方法并传递令牌。然后异步方法生成许多任务,将取消令牌传递给每个任务,然后等待任务集合。这些任务每个都包含通过轮询 IsCancellationRequested 优雅地取消的逻辑。
我的问题是,如果我将 CancellationToken 传递给 Task.Run(),则会引发包含 TaskCanceledException 的 AggregateException。这可以防止任务正常取消。
为了解决这个问题,我无法将 CancelationToken 传递给 Task.Run,但是我不确定我会失去什么。例如,我喜欢这样的想法,即如果我的任务挂起并且无法执行优雅的取消,则此异常将强制它关闭。我在想我可以用两个 CancelationTokens 来处理这个问题,一个“优雅”,另一个“强制”。但是,我不喜欢这种解决方案。
这是一些代表我上面描述的伪代码..
c# - 如何取消 CancellationToken
我开始一个任务,然后开始其他任务等等。鉴于该树,如果任何任务失败,则整个操作的结果将毫无用处。我正在考虑使用取消令牌。令我惊讶的是,令牌没有“CancelThisToken()”方法......
我怎样才能只拥有一个CancellationToken来取消它?
c# - 为什么我在异步方法中调用 CancellationTokenSource 的 Cancel 方法时任务没有取消?
CancellationToken
我在and周围创建了一个小包装器CancellationTokenSource
。我遇到的问题是 的CancelAsync
方法CancellationHelper
没有按预期工作。
我遇到了该ItShouldThrowAExceptionButStallsInstead
方法的问题。要取消正在运行的任务,它会调用await coordinator.CancelAsync();
,但该任务实际上并未取消,也不会引发异常task.Wait
ItWorksWellAndThrowsException
似乎运行良好并且它使用coordinator.Cancel
,这根本不是异步方法。
CancellationTokenSource
当我在异步方法中调用 Cancel 方法时,为什么任务没有被取消?
不要让waitHandle
你迷惑,这只是为了不让任务提前完成。
让代码自己说话:
c# - 对 CancellationTokenSource.Cancel 的调用永远不会返回
我有一个电话CancellationTokenSource.Cancel
永远不会返回的情况。相反, afterCancel
被调用(并且在它返回之前),执行将继续执行被取消代码的取消代码。如果被取消的代码随后没有调用任何可等待的代码,那么最初调用的调用者Cancel
永远不会重新获得控制权。这很奇怪。我希望Cancel
简单地记录取消请求并独立于取消本身立即返回。事实上,Cancel
被调用的线程最终会执行属于被取消操作的代码,并且在返回到调用者之前执行此操作,这Cancel
看起来像是框架中的一个错误。
这是怎么回事:
有一段代码,我们称之为“工作代码”,它正在等待一些异步代码。为了简单起见,假设这段代码正在等待 Task.Delay:
/li>
就在“工作代码”调用之前Task.Delay
,它正在线程 T1 上执行。延续(即“等待”之后的行或 catch 内的块)稍后将在 T1 或其他线程上执行,具体取决于一系列因素。
- 还有一段代码,我们称之为“客户端代码”,它决定取消
Task.Delay
. 此代码调用cancellationToken.Cancel
. 调用Cancel
是在线程 T2 上进行的。
我希望线程 T2 通过返回到Cancel
. 我还希望catch (OperationCanceledException)
很快在线程 T1 或 T2 以外的某个线程上看到执行的内容。
接下来发生的事情令人惊讶。我看到在线程 T2 上,在Cancel
被调用之后,执行立即继续执行,内部的块catch (OperationCanceledException)
。当Cancel
仍在调用堆栈上时,就会发生这种情况。就好像调用Cancel
被取消的代码劫持了一样。这是显示此调用堆栈的 Visual Studio 屏幕截图:
更多上下文
以下是有关实际代码作用的更多上下文: 有一个累积请求的“工作代码”。一些“客户端代码”正在提交请求。每隔几秒钟,“工作代码”就会处理这些请求。已处理的请求将从队列中删除。然而,偶尔,“客户端代码”会决定它达到了它希望立即处理请求的地步。为了将其传达给“worker code”,它调用了Jolt
“worker code”提供的方法。Jolt
“客户端代码”正在调用的方法通过取消Task.Delay
由工作人员的代码主循环执行的 a 来实现此功能。工作人员的代码已Task.Delay
取消并继续处理已排队的请求。
实际代码被精简为最简单的形式,代码可在 GitHub 上找到。
环境
该问题可以在控制台应用程序、适用于 Windows 的通用应用程序的后台代理和适用于 Windows Phone 8.1 的通用应用程序的后台代理中重现。
该问题无法在适用于 Windows 的通用应用程序中重现,其中代码按预期工作并且调用Cancel
立即返回。
c# - 停止/处置/取消任务 C#
我正在尝试通过从各种存储库(如 google drive/dropbox/ftp 等)导入 DLL 来在 Windows 服务中部署 DLL...
但在实例化任何新的 DLL 之前,我希望关闭之前正在运行的实例。
我正在使用任务和反思。
我无法弄清楚如何取消在运行时实例化 DLL 的任务(因为实例化的 dll 是一个长时间运行的应用程序示例文件观察器..)
问题:我想在我的应用程序检测到新的 dll 并尝试通过此任务代码执行它之前取消任务 t。
编辑 我删除了取消令牌代码,因为它正在破坏。这是带有取消令牌的实际代码。
我的想法是,如果我能以某种方式取消并处置持有实例化上下文的任务,则程序集将被释放,然后我将能够更新程序集并再次通过任务重新实例化它。
我知道我在某个地方出错了,请解释一下。
编辑
我对 assemblyDomain.DoCallBack(delegate) 寄予厚望。但我得到一个错误。这是引发错误的代码的简化版本。
错误:
在程序集“AppDomain,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”中键入“AppDomain.Program+<>c__DisplayClass2”未标记为可序列化。
堆栈跟踪 :
请注意:我已将导入的程序集中的类 Program 标记为可序列化
更新 :
动态拉取程序集的代码