问题标签 [cancellation-token]

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 投票
5 回答
13033 浏览

.net - default(CancellationToken) 是否等同于 CancellationToken.None?

看着执行CancellationToken.None,简直就是回归default(CancellationToken)。但是,我在CancellationToken的文档中没有看到两者是等价的。

我想提供一个这样的 API,但直到我确定它总是可以工作:

它定义的行为default(CancellationToken)是否与 相同CancellationToken.None,或者这只是一个实现细节?

0 投票
8 回答
3458 浏览

c# - 如何使方法可以取消而不变得丑陋?

我目前正在改进我们的长期运行方法,使其可以取消。我打算使用 System.Threading.Tasks.CancellationToken 来实现它。

我们的方法通常会执行一些长时间运行的步骤(主要是向硬件发送命令然后等待硬件),例如

我对取消的第一个(也许是愚蠢的)想法会将其转变为

坦率地说,这看起来很可怕。这种“模式”也会在单个步骤中继续存在(而且它们已经相当长了)。这将使 Thread.Abort() 看起来相当性感,尽管我知道它不推荐。

是否有一种更简洁的模式来实现这一点,它不会隐藏大量样板代码下的应用程序逻辑?

编辑

作为步骤性质的示例,该Run方法可以读取

我们正在控制需要同步才能协同工作的不同硬件单元。

0 投票
0 回答
186 浏览

c# - 如何与两个 DLL 共享一个取消令牌?

我在FIRST dll中有以下代码:

方法类classASECOND dll中:

然后,我的方法 FuncAsync 在控制台应用程序中被调用:

第一个DLL包括第二个,控制台应用程序包括第一个DLL。

这段代码编译得很好,没有警告,没有错误。但是在执行时,行错误: Save(a, b, ct);

Additional information: Could not load type 'ProgressHandler' from assembly 'A.B.C, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'func' has no implementation (no RVA).

如果我从代码中删除 CancellationToken,一切正常。

如何将我的 CancellationToken 从应用程序发送到 DLL1,然后从 DLL1 发送到 DLL2?

编辑 :

我忘了准确地说,我只使用以下命令将两个 DLL 合并为一个:

当我不合并库时,我的代码中没有错误。

0 投票
5 回答
12744 浏览

c# - 在键盘事件中使用 CancellationToken 调用 Task.Delay 时出现 TaskCanceledException

我试图延迟处理从 WinRT 中的键盘事件调用的方法(示例中为 SubmitQuery()),直到在一段时间内(在本例中为 500 毫秒)没有进一步的事件。

我只希望 SubmitQuery() 在我认为用户完成输入时运行。

使用下面的代码,我在 Task.Delay(500,cancellationToken.Token); 时不断收到 System.Threading.Tasks.TaskCanceledException 叫做。请问我在这里做错了什么?

0 投票
1 回答
888 浏览

c# - 在任务中发送取消令牌

我有一个async我希望能够取消当前调用的方法

我一直在尝试找出能够调用此方法并将其传递给 CancellationToken 的语法。这是我到目前为止所尝试的。

我计划在方法内部检查是否在继续之前请求取消。我在文档中找不到任何示例

我所拥有的不会获得该WebClientRetryAsync方法的令牌,所以这不起作用。

0 投票
1 回答
1939 浏览

asynchronous - f# async 何时检查其 CancellationToken?

我正在阅读F# 以获取乐趣和利润 - 异步编程。在取消工作流程下,他们有以下示例:

关于这一点,他们说:

在 F# 中,任何嵌套的异步调用都会自动检查取消令牌!

在这种情况下,它是行:

从输出中可以看出,这一行是取消发生的地方。

但是,对我来说(VS2010、F# 2.0、F# Interactive)我得到以下输出。..after请注意在我取消令牌后它是如何打印的。他们只是错了吗?

所以也许在进入 时检查取消Async.Sleep?不,那么它会打印:

所以看起来检查实际上是在for循环中!即它一直运行,直到被取消后的for循环。这是它的工作原理吗?那么如果我希望它在睡眠后检查呢?

这个问题似乎暗示了我上面描述的取消工作:我可以显式检查取消/终止异步计算吗?

编辑:关于这是否仅在 FSI 2.0 中:如果一个循环分别睡 200 毫秒、2500 毫秒和 4000 毫秒,会发生什么情况?它打印在中间吗?

0 投票
2 回答
5516 浏览

c# - 为什么存在 CancellationTokenRegistration 以及为什么它实现 IDisposable

我一直在看到在结果中使用Cancellation.Register带有using子句的代码CancellationTokenRegistration

我知道你应该确保你Dispose是一个IDisposable,但为什么它甚至实现IDisposable?它必须释放哪些资源?它唯一的方法是关于平等。

如果你不这样做会发生Dispose什么?你漏什么?

0 投票
2 回答
6739 浏览

c# - 异步网络操作永远不会完成

我有几个异步网络操作返回一个可能永远不会完成的任务:

  1. UdpClient.ReceiveAsync不接受CancellationToken
  2. TcpClient.GetStream返回一个NetworkStream不尊重CancellationTokenon 的Stream.ReadAsync(仅在操作开始时检查取消)

两者都等待可能永远不会出现的消息(例如,由于丢包或无响应)。这意味着我有永远不会完成的幻像任务,永远不会运行的延续和暂停使用的套接字。我知道我可以使用TimeoutAfter,但这只会解决延续问题。

那我该怎么办?

0 投票
1 回答
3809 浏览

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

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

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

为什么停不下来?

编辑 1:

0 投票
1 回答
229 浏览

c# - .NET 4.5.1 跟踪所有取消任务?

5 个不相关的类实例执行 Task.Run() 以启动 1-4 个“做事”的实例。每个任务都有一个 CancellationToken。让另一个对象停止所有这些生成的任务而不接触/影响它们的生成对象的酷或聪明的方法是什么?如果这是 .NET 2.0 天,我可能会在另一个 AppDomain 中启动事情,然后终止 AppDomain 以停止子工作,或类似的事情。我还想到子任务可能会在 Timer 间隔上检查静态类以查看它是否应该停止,但如果可能的话,我希望将责任排除在生成的任务之外。