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

c# - 正确取消异步操作并再次触发

如何处理用户可能多次点击按钮的情况,这会调用长时间运行的异步操作。

我的想法是首先检查异步操作是否正在运行,取消它并再次触发它。

到目前为止,我已经尝试使用 CancellationTokenSource 构建这种功能,但它没有按预期工作。有时会运行两个异步操作,因此当我启动新的异步操作时,“旧”异步操作尚未取消,这会混淆结果处理。

任何建议或例子如何处理这种情况?

编辑:最后,我认为在短时间内运行两个异步操作还不错(当新操作被触发但旧操作尚未取消时)。

这里真正的问题是我如何为最终用户显示进度。当旧的异步操作结束时,它会向最终用户隐藏进度指示器,但新触发的异步操作仍在运行。

EDIT2:在 DrawContent(...) 内部,我使用 ThrowIfCancellationRequested,因此取消正在运行的任务似乎可以正常工作。

关于进度显示。调用 Draw() 时,我将加载指示器设置为可见,当此方法结束时,我隐藏加载指示器。所以现在当我开始新的异步操作后取消之前的异步操作时,我的加载指示器被设置为隐藏。当“旧”方法结束时,如果还有另一种异步方法仍在运行,我应该如何跟踪。

0 投票
2 回答
897 浏览

c# - Why the task cancellation happens on the caller thread?

I found a problem on a task cancellation pattern, and I would like to understand why should work in this way.

Consider this small program, where a secondary thread perform an async "long" task. In the mean time, the primary thread notifies for the cancellation.

The program is a very simplified version of a bigger one, which could have many concurrent threads doing a "long task". When the user ask to cancel, all the running task should be cancelled, hence the CancellationTokenSource collection.

Despite locking the collection access, the thread accessing it is the same as the one requesting the cancellation. This is, the collection is modified during an iteration, and an exception is raised.

For better clarity, you can comment out the whole "foreach" and uncomment the very last instruction, as follows:

Doing so, there's no exception, and the program terminates gracefully. However, it's interesting to see the ID of the threads involved:

Apparently, the "finally" body is run on the caller thread, but once off the "Invoker", the thread is the secondary.

Why the "finally" block is not executed in the secondary thread instead?

0 投票
1 回答
2464 浏览

c# - 如何从 C# 取消 C++/CX 中的异步操作

我正在尝试从 C# 取消以 C++/CX 编写的操作。尽管我编写了两段代码,但在从 C# 端等待它时,我无法正确取消操作。这是一个例子:

从 C#:

从 C++:

问题似乎是在跨 ABI 调用任务时,将令牌传递到 AsTask 扩展方法中没有任何作用。在调试 C++ 端时, ct 和 is_task_cancellation_requested() 函数都表明尚未请求取消。

0 投票
3 回答
1548 浏览

c# - 使用 TPL 数据流,我可以取消所有帖子然后添加一个吗?

使用 TPL 数据流库,我想做这样的事情:

看来 ActionBlock 上的取消令牌取消了整个事情;如果我设置它,我必须制作一个新的 ActionBlock。是否可以使用 ActionBlock 进行部分取消?

不应尝试尚未处理的帖子。如果有一些取消令牌可用于签入当前正在执行的帖子,那就太好了。

0 投票
1 回答
3809 浏览

c# - 取消令牌和线程不起作用

我想取消一个线程并在之后运行另一个线程。这是我的代码:

当我调用此方法时,第一个线程不会停止,第二个线程开始运行......
但如果我跳过最后两行它可以工作:

为什么停不下来?

编辑 1:

0 投票
2 回答
1254 浏览

.net - CancellationTokenSource.Cancel 在 WPF 中无法按预期工作

尝试学习任务、等待和取消。
从我认为来自 MSDN 的一个简单示例开始。
Task.Wait 方法(CancellationToken)

作为控制台应用程序,它按预期运行。
相同的代码在 WPF 中没有按预期运行。
在 WPF t2 中运行到完成 - 行任务完成在调试中打印。
它在 0 到 100000000 之间遇到 OperationCanceledException,但 t2 继续运行。
(注意必须将其更改为 ctr < Int32.MaxValue 否则它永远不会完成)

在 .NET 4.5 上,也尝试过 4.51

控制台应用程序有问题
这里是代码

添加了 ThrowIfCancellationRequested
我在该行收到错误 OperationCancelException is unhandled by user code

好的,我知道这越来越长
了 来自 Microsoft 的那个样本充其量是误导 - 为什么你会有一个没有真正取消的 Cancel 样本
来验证为什么 Rohit 说我添加了以下内容
果然我可以在新闻发布前看到更多的通行证任何继续的键

0 投票
3 回答
8982 浏览

c# - CancellationTokenSource.Cancel 引发异常

当我阅读文档时,CancellationTokenSource.Cancel 不应该引发异常。
CancellationTokenSource.Cancel

下面是对 cts.Cancel() 的调用;导致(不抛出)OperationCanceledException。
我对此非常有信心,就好像我注释掉了那一行然后最后一个 OperationCanceledException 不会被抛出。

随着 cts.Cancel 行处于活动状态,抛出异常的行是 t2.Wait(token);
如果我有延迟 cts.Cancel(); 然后 t2.Wait(token); 调用该行时不会立即抛出异常。
t2.Wait(令牌);仅在运行 cts.Cancel() 时引发该异常。
这是正确的行为吗?
如果它是一致的,那么我可以忍受它,但我不希望 cts.Cancel 导致异常。
我显然很困惑——我只是想了解这种行为,这样我就可以放心地将它带到生产环境中。
现在我正在使用 BackGroundWorker 执行此操作,我认为我可以使用等待和取消更轻松地跟踪和维护。

if (token.IsCancellationRequested || ctr == 100000000)
仍然抛出 ctr == 100000000
我仍然看到内部 OperationCanceledException 被捕获并且外部(较低)根本没有被抛出。

这段代码有问题吗?
或者它应该如何工作?

如果没有 Task t2 = Task.Run 中的 try catch,我会抛出未捕获的异常。
我认为这会被 t2.Wait 上的 try catch 捕获,但一次只有一个问题。

这是 .NET 4.5 上的控制台应用程序。

0 投票
2 回答
5167 浏览

c# - ThrowIfCancellationRequested 似乎没有抛出任何异常

我有以下代码:

list包含很少的元素。当我按“c”时,所有Compute方法都已启动。

当我按“c”时,不会引发异常。每个Compute方法都会继续执行,直到正常结束。

Compute当我按“c”时,我想停止/杀死所有剩余方法。

0 投票
1 回答
2182 浏览

c# - 我如何知道一个任务是否被超时或手动触发取消?

假设我有以下 Start 和 Cancel 事件处理程序。我怎么知道是谁触发了取消?

0 投票
1 回答
617 浏览

c# - 如何在用户取消后停止异步任务并重新启动它

我需要异步实现一个长时间运行的进程。我已经使用 Task.Run() 完成了所有工作,没有任何问题。然而,需求发生了变化,现在他们想要任何正在进行的异步任务的“取消”功能。如果我以更简单的形式解释要求;我有一个按钮、文本框和一个列表框。当用户在文本框中输入内容并单击按钮时,如果用户改变主意并再次在文本框并单击按钮,它应该停止当前正在运行的任务,清除列表框并应该使用在他第二次尝试中输入的新值启动任务(获取和显示数据)。

我尝试为此使用取消令牌,但没有成功。如果有人可以帮助我,我将不胜感激。