问题标签 [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 投票
1 回答
2868 浏览

c# - CancellationTokenSource 与 volatile 布尔值

volatile布尔字段上使用CancellationTokenSource来指示 a完成有什么好处吗?Task

0 投票
2 回答
4349 浏览

c# - 带有 CancellationToken 的异步/等待不会取消操作

我想使用CancellationToken中止文件下载。这是我尝试过的:

然后应使用cancelToken取消操作:

好像IsCancellationRequested没有更新。所以操作不会被取消。我也试过用这个

但没有任何改变。

我做错了什么?

编辑:

以下是缺少的部分,例如GetDocumentById

0 投票
1 回答
142 浏览

c# - 如何取消并发的繁重任务?

我有一个繁重的进程在其体内运行的任务。此外,我们无法访问此方法的主体(繁重的进程),我们必须等到完成该进程。

现在我的问题是,如何在不中断任务的情况下取消,以便不检查其中的任何值?

我的代码是这样的:

运行后我可以取消繁重的过程吗?

0 投票
0 回答
349 浏览

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

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

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

这是我所拥有的:

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

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

提前致谢。安迪

0 投票
3 回答
672 浏览

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

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

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

0 投票
2 回答
6138 浏览

c# - 如何使用 CancellationToken 安全地取消任务并等待 Task.WhenAll

我有一个框架,它创建一个 CancellationTokenSource,配置 CancelAfter,然后调用一个异步方法并传递令牌。然后异步方法生成许多任务,将取消令牌传递给每个任务,然后等待任务集合。这些任务每个都包含通过轮询 IsCancellationRequested 优雅地取消的逻辑。

我的问题是,如果我将 CancellationToken 传递给 Task.Run(),则会引发包含 TaskCanceledException 的 AggregateException。这可以防止任务正常取消。

为了解决这个问题,我无法将 CancelationToken 传递给 Task.Run,​​但是我不确定我会失去什么。例如,我喜欢这样的想法,即如果我的任务挂起并且无法执行优雅的取消,则此异常将强制它关闭。我在想我可以用两个 CancelationTokens 来处理这个问题,一个“优雅”,另一个“强制”。但是,我不喜欢这种解决方案。

这是一些代表我上面描述的伪代码..

0 投票
4 回答
47362 浏览

c# - 如何取消 CancellationToken

我开始一个任务,然后开始其他任务等等。鉴于该树,如果任何任务失败,则整个操作的结果将毫无用处。我正在考虑使用取消令牌。令我惊讶的是,令牌没有“CancelThisToken()”方法......

我怎样才能拥有一个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 投票
3 回答
3471 浏览

c# - 对 CancellationTokenSource.Cancel 的调用永远不会返回

我有一个电话CancellationTokenSource.Cancel永远不会返回的情况。相反, afterCancel被调用(并且在它返回之前),执行将继续执行被取消代码的取消代码。如果被取消的代码随后没有调用任何可等待的代码,那么最初调用的调用者Cancel永远不会重新获得控制权。这很奇怪。我希望Cancel简单地记录取消请求并独立于取消本身立即返回。事实上,Cancel被调用的线程最终会执行属于被取消操作的代码,并且在返回到调用者之前执行此操作,这Cancel看起来像是框架中的一个错误。

这是怎么回事:

  1. 有一段代码,我们称之为“工作代码”,它正在等待一些异步代码。为了简单起见,假设这段代码正在等待 Task.Delay:

    /li>

就在“工作代码”调用之前Task.Delay,它正在线程 T1 上执行。延续(即“等待”之后的行或 catch 内的块)稍后将在 T1 或其他线程上执行,具体取决于一系列因素。

  1. 还有一段代码,我们称之为“客户端代码”,它决定取消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立即返回。

0 投票
1 回答
1485 浏览

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 标记为可序列化

更新 :

动态拉取程序集的代码