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

c# - 取消令牌的使用

我正在尝试学习如何使用取消令牌取消任务。在这里,我为它编写了一个 UnitTest,但我没有得到它的工作方式。

在上面的测试中,我在调用方法cts.Cancel()之前调用了CheckMeCalled。所以它不应该在取消时运行。但它正在全力以赴。

我在某处读过:

如果 Task 没有运行并且你取消它,那么它不会进入运行状态,而是在你调用它时进入取消状态。

但这似乎并没有在这里发生。有人能给我解释一下吗?

0 投票
1 回答
1347 浏览

c# - MSTest 取消机制

是否有任何机制为单元测试提供 CancellationToken(或者可能是 [TestInitialize] 之类的属性),可以用来理解单元测试被取消?我找不到。

0 投票
3 回答
14593 浏览

c# - 使用“return”终止或退出 C# 异步方法

我对async-awaitin 中的方法C# 5.0不熟悉,我的脑海中没有几个问题

  1. async如果输入参数或空值检查失败,转义方法的最佳方法是什么?

  2. return;在 Task方法中使用的逻辑流程是什么async(在某些情况下,它变成了无限循环)?

  3. 在这种情况下是否CancellationTokenTask.Yield合适?

0 投票
1 回答
307 浏览

c# - 在我使用 linq 键入时运行任务(如果仍在运行,请取消上一个任务)

我想创建一个在我键入时使用 linq 搜索的任务,如果用户键入另一个字符,它应该取消任务并重新创建搜索,我有以下代码:

我得到这个例外:

'System.OperationCanceledException' 发生类型异常System.Core.dll但未在用户代码中处理

附加信息:操作已取消。

我是任务和取消令牌的初学者,有人可以从这里引导我走正确的道路吗?我基本上希望任务检查它是否已经运行,取消它,然后使用新值再次运行它(我想让这个“SearchBox”功能类似于 Visual Studio 在解决方案资源管理器中的搜索,它会在你输入时搜索)

0 投票
2 回答
5294 浏览

task-parallel-library - 如何创建取消的任务

我正在编写一个 Stream 类并在 ReadAsync 方法中被阻止。请看一下代码,我认为它可以更好地解释我可以用我的英语做的情况。

使用 ILSpy 我可以看到其他 Stream 类返回一个已取消的任务,如下所示:

但是,Task 的构造函数是内部的,我无法调用它。

谷歌根本没有帮助我。

0 投票
4 回答
12451 浏览

c# - 具有异步 Dapper 方法的 CancellationToken?

我正在使用 Nuget 的 Dapper 1.31。我有这个非常简单的代码片段,

当我按下F12QueryAsync,它指向我

它的签名上没有CancellationToken

问题:

  • 假设整个解决方案没有编译器错误,为什么片段完全可构建?
  • 请原谅我无法测试调用tokenSource.Cancel()是否真的会取消该方法,因为我不知道如何生成长时间运行的 sql 查询。真的会.Cancel()取消方法并抛出OperationCancelledException吗?

谢谢!

0 投票
1 回答
116 浏览

c# - CancellationToken 影响由另一个 CancellationToken 控制的任务子集的好方法

有没有办法将取消令牌绑定到由另一个取消令牌控制的任务子集?......在这个例子中,我创建了两个cancellationTokenSource......并将一个注册到另一个的Cancel函数......如果我这样取消图像的加载...它只会取消那些任务...但是如果我取消所有...它会取消所有任务...有没有更好的方法来做到这一点?(这种方式看起来很乱......例如何时取消注册)

0 投票
1 回答
755 浏览

c# - Task.Factory.StartNew 的包装方法,用于执行具有不同参数和返回值的自定义方法

我正在使用.NET 4.0在C#中开发MDI应用程序。我创建了一个包装类来管理不同任务上某些方法的执行。TaskManager

所以我可以打电话:

我需要在一个单独的Task.

我创建了这个包装类来避免调用Task.Factory.StartNew()分散在代码周围的代码,从而保持它的干净,并且能够以某种方式跟踪线程。

我的问题是现在我正在尝试实现取消Task,例如如果用户按ESCTask中止。为此,我需要使用CancellationToken并将其作为参数添加到我的所有方法中。然后必须在每个方法体中检查它。例如:

现在,我的TaskManager.StartNewTask()逻辑是这样的:

我想要什么:

  1. 我需要更改 TaskManager.StartNewTask() 能够将 CancellationToken 传递给方法的逻辑,但我不知道该怎么做......
  2. 我还想知道是否有可能创建一个更通用的方法,该方法可以使用 任意数量的输入参数任何类型的返回值TaskManager.StartNewTask()来执行任何类型的方法。

我需要这样的东西:

更新 1(针对问题 n.2) (更改了 CustomMethod)

如果我必须执行类似的方法

Task使用我的TaskManager.StartNewTask()方法的新方法中,我应该如何更改StartNewTask()以及如何拨打电话?

就像是

代码可能是这样的

更新 2

在为我的问题 2 尝试了@Sriram Sakthivel 建议后,我现在有了以下代码:

它让我回到 2... 但是 a = 1 和 b = 3... 所以总和应该是 4!

它可能与TaskManager.StartNewTask()...的返回类型有关。但是我应该如何管理我在新任务中执行的方法的返回值?怎么了?

0 投票
1 回答
3253 浏览

c# - 跨线程退出/取消 while 循环的技术:bool、ManualResetEvent 或 CancellationToken

我正在编写一个有几个线程的程序,每个线程都有一个 while 循环,直到用户指定它应该停止。我想到了几种退出循环的方法,然后是线程,并在下面概述了这些方法。

问题

  1. 每个都有优点和缺点吗?
  2. 是否存在您会使用一种而不使用另一种的情况?
  3. 我听说有些人说他们更喜欢 CancellationTokens 来退出线程。与其他两种方法相比,这种方法有什么吸引力?

下面是方法。

bool方法_

最初,我声明了一个 bool 并声明循环一直运行,直到用户将 bool 设置为 false: while(running) { Thread.Sleep(10); /*do work*/ }。然后我思考这是否完全是线程安全的。如果编译器做了一些优化并将 bool 移动到寄存器会怎样。在这种情况下,线程将看到不同的布尔值。结果,我用volatile关键字标记了 bool 以避免编译器优化。

ManualResetEvent方法_

我的下一个方法是创建一个ManualResetEvent,然后说 bool 在 WaitOne() 为 false 时运行:while(!mre.WaitOne(10)) {/*do work*/}。这将阻塞 10 毫秒,然后运行循环,一遍又一遍,直到我们这样做mre.Set()并且循环退出。

CancellationToken方法_

这种方法我还没有真正尝试过,但我读过几个人们更喜欢用这种方式取消线程的地方。它显然是线程安全的。可以定义 a CancellationTokenSource,调用它cts,然后传递cts.Token给新线程运行的方法,并使用 if 语句检查是否已请求取消:while(!token.IsCancellationRequested) { Thread.Sleep(10); /*do work*/ }

更新 1:

我发现了一个类似的帖子,得出的结论是该MRE方法比该CancellationToken方法慢得多。有关完整信息,请参阅此处:停止线程、ManualResetEvent、volatile boolean 或 cancelToken

更新 2:

在将bool方法与其他两种方法进行比较时,Eric Lippert 在这里有一个很好的答案:AutoResetEvent vs. boolean to stop a thread

更新 3:

我找到了另一个相关的信息。CancellationTokens 一旦被取消就不能被重置。因此,当您只想暂时取消循环以稍后重新启动时,它并不理想。为此,MRE 可能会更好(您可以随心所欲地设置和重置)。

0 投票
1 回答
680 浏览

c# - 如何在 PLINQ 中等待取消令牌注册方法

正如您在下面的代码中看到的那样,ProcessThisEmployee 会为每个 Employee 调用。在该方法中,当操作被取消时,我调用第三方库的 Clean 方法。假设 Clean 方法需要相当长的时间。当 ProcessThisEmployee 方法的所有运行实例的 Clean 方法完成时,我想做的是在 UI 中显示一些消息。这意味着我需要等待所有 Clean 方法完成。现在,我有一个 WaitAll 用于任务,但我不确定它是否也会等待所有 canellations 完成。有任何想法吗?