问题标签 [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.
c# - 取消令牌的使用
我正在尝试学习如何使用取消令牌取消任务。在这里,我为它编写了一个 UnitTest,但我没有得到它的工作方式。
在上面的测试中,我在调用方法cts.Cancel()
之前调用了CheckMeCalled
。所以它不应该在取消时运行。但它正在全力以赴。
我在某处读过:
如果 Task 没有运行并且你取消它,那么它不会进入运行状态,而是在你调用它时进入取消状态。
但这似乎并没有在这里发生。有人能给我解释一下吗?
c# - MSTest 取消机制
是否有任何机制为单元测试提供 CancellationToken(或者可能是 [TestInitialize] 之类的属性),可以用来理解单元测试被取消?我找不到。
c# - 使用“return”终止或退出 C# 异步方法
我对async-await
in 中的方法C# 5.0
不熟悉,我的脑海中没有几个问题
async
如果输入参数或空值检查失败,转义方法的最佳方法是什么?return;
在 Task方法中使用的逻辑流程是什么async
(在某些情况下,它变成了无限循环)?在这种情况下是否
CancellationToken
更Task.Yield
合适?
c# - 在我使用 linq 键入时运行任务(如果仍在运行,请取消上一个任务)
我想创建一个在我键入时使用 linq 搜索的任务,如果用户键入另一个字符,它应该取消任务并重新创建搜索,我有以下代码:
我得到这个例外:
'System.OperationCanceledException'
发生类型异常System.Core.dll
但未在用户代码中处理
附加信息:操作已取消。
我是任务和取消令牌的初学者,有人可以从这里引导我走正确的道路吗?我基本上希望任务检查它是否已经运行,取消它,然后使用新值再次运行它(我想让这个“SearchBox”功能类似于 Visual Studio 在解决方案资源管理器中的搜索,它会在你输入时搜索)
task-parallel-library - 如何创建取消的任务
我正在编写一个 Stream 类并在 ReadAsync 方法中被阻止。请看一下代码,我认为它可以更好地解释我可以用我的英语做的情况。
使用 ILSpy 我可以看到其他 Stream 类返回一个已取消的任务,如下所示:
但是,Task 的构造函数是内部的,我无法调用它。
谷歌根本没有帮助我。
c# - 具有异步 Dapper 方法的 CancellationToken?
我正在使用 Nuget 的 Dapper 1.31。我有这个非常简单的代码片段,
当我按下F12时QueryAsync
,它指向我
它的签名上没有CancellationToken
。
问题:
- 假设整个解决方案没有编译器错误,为什么片段完全可构建?
- 请原谅我无法测试调用
tokenSource.Cancel()
是否真的会取消该方法,因为我不知道如何生成长时间运行的 sql 查询。真的会.Cancel()
取消方法并抛出OperationCancelledException
吗?
谢谢!
c# - CancellationToken 影响由另一个 CancellationToken 控制的任务子集的好方法
有没有办法将取消令牌绑定到由另一个取消令牌控制的任务子集?......在这个例子中,我创建了两个cancellationTokenSource......并将一个注册到另一个的Cancel函数......如果我这样取消图像的加载...它只会取消那些任务...但是如果我取消所有...它会取消所有任务...有没有更好的方法来做到这一点?(这种方式看起来很乱......例如何时取消注册)
c# - Task.Factory.StartNew 的包装方法,用于执行具有不同参数和返回值的自定义方法
我正在使用.NET 4.0在C#中开发MDI应用程序。我创建了一个包装类来管理不同任务上某些方法的执行。TaskManager
所以我可以打电话:
我需要在一个单独的Task
.
我创建了这个包装类来避免调用Task.Factory.StartNew()
分散在代码周围的代码,从而保持它的干净,并且能够以某种方式跟踪线程。
我的问题是现在我正在尝试实现取消Task
,例如如果用户按ESC键Task
中止。为此,我需要使用CancellationToken
并将其作为参数添加到我的所有方法中。然后必须在每个方法体中检查它。例如:
现在,我的TaskManager.StartNewTask()
逻辑是这样的:
我想要什么:
- 我需要更改
TaskManager.StartNewTask()
能够将 CancellationToken 传递给方法的逻辑,但我不知道该怎么做...... - 我还想知道是否有可能创建一个更通用的方法,该方法可以使用 任意数量的输入参数和任何类型的返回值
TaskManager.StartNewTask()
来执行任何类型的方法。
我需要这样的东西:
更新 1(针对问题 n.2) (更改了 CustomMethod)
如果我必须执行类似的方法
在Task
使用我的TaskManager.StartNewTask()
方法的新方法中,我应该如何更改StartNewTask()
以及如何拨打电话?
就像是
代码可能是这样的
更新 2
在为我的问题 2 尝试了@Sriram Sakthivel 建议后,我现在有了以下代码:
它让我回到 2... 但是 a = 1 和 b = 3... 所以总和应该是 4!
它可能与TaskManager.StartNewTask()
...的返回类型有关。但是我应该如何管理我在新任务中执行的方法的返回值?怎么了?
c# - 跨线程退出/取消 while 循环的技术:bool、ManualResetEvent 或 CancellationToken
我正在编写一个有几个线程的程序,每个线程都有一个 while 循环,直到用户指定它应该停止。我想到了几种退出循环的方法,然后是线程,并在下面概述了这些方法。
问题
- 每个都有优点和缺点吗?
- 是否存在您会使用一种而不使用另一种的情况?
- 我听说有些人说他们更喜欢 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 可能会更好(您可以随心所欲地设置和重置)。
c# - 如何在 PLINQ 中等待取消令牌注册方法
正如您在下面的代码中看到的那样,ProcessThisEmployee 会为每个 Employee 调用。在该方法中,当操作被取消时,我调用第三方库的 Clean 方法。假设 Clean 方法需要相当长的时间。当 ProcessThisEmployee 方法的所有运行实例的 Clean 方法完成时,我想做的是在 UI 中显示一些消息。这意味着我需要等待所有 Clean 方法完成。现在,我有一个 WaitAll 用于任务,但我不确定它是否也会等待所有 canellations 完成。有任何想法吗?