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

c# - 在 Task.Run 中使用 CancellationToken 超时不起作用

好的,我的问题很简单。为什么这段代码不抛出TaskCancelledException

但这一个有效

0 投票
1 回答
1252 浏览

c# - 不存在 AsTask 来实现异步读取的取消超时

stream.ReadAsync()我渴望在我的这篇文章中添加超时功能并阅读 Microsoft 帮助Async Cancellation: Bridging between the .NET Framework and the Windows Runtime (C# and Visual Basic)。本文建议使用AsTask()来实现这一点。但是我的 C# 似乎根本无法识别AsTask()

我正在使用带有Windows 7Visual Studio 2013 ,这是我拥有的一段代码:using System.Threading;

伙计们,我在这里想念什么。我很困惑:)

更新:这些是安装的 .NET 包列表,我会说 Visual Studio 2013 使用 4.5

在此处输入图像描述

0 投票
2 回答
3775 浏览

c# - 传入已取消的 CancellationToken 会导致 HttpClient 挂起

我想使用 aCancellationToken来取消对 的调用HttpClient.PostAsJsonAsync。但是,通过以下设置,调用会PostAsJsonAsync无限期挂起(我让它运行了几分钟)。

请注意,我传递了一个已经取消的CancellationTokenSource- 如果我在Task.Delay短时间内取消使用令牌,我也会遇到同样的问题。

我意识到我可以简单地在调用之前检查令牌是否已被取消,但即便如此,如果令牌在短暂延迟后被取消,我也会遇到同样的问题,即它在方法调用之前没有被取消,但在之后不久就变得如此它。

所以我的问题是,是什么原因造成的,我能做些什么来解决/修复它?

编辑

对于那些寻找解决方法的人,受@Darrel Miller 的回答启发,我想出了以下扩展方法:

0 投票
3 回答
10314 浏览

c# - 如何捕获 CancellationToken.Register 回调异常?

我正在使用异步 I/O 与 HID 设备进行通信,并且我想在超时时抛出一个可捕获的异常。我有以下读取方法:

令牌回调抛出的异常没有被任何 try/catch 块捕获,我不知道为什么。我以为它会在等待时被抛出,但事实并非如此。有没有办法捕捉这个异常(或者让它可以被 Read() 的调用者捕捉到)?

编辑: 所以我重新阅读了msdn的文档上的文档,它说“委托生成的任何异常都将传播出这个方法调用。”

我不确定“从这个方法调用中传播”是什么意思,因为即使我将 .Register() 调用移到 try 块中,仍然没有捕获到异常。

0 投票
1 回答
157 浏览

c# - 取消令牌时发生 InvalidOperationException

我在将 canceltoken 传递给函数时遇到问题。我得到 InvalidOperationException ,“调用线程无法获得对象的权限,因为它属于另一个线程”。

这是我的代码。

任何人都知道如何用这个错误解决这个问题?

0 投票
1 回答
357 浏览

c# - Task.RunSynchronously() 不关心 CancellationToken

我想在当前线程上执行第 3 方函数(以避免开销),但希望能够随时使用CancellationToken来中断该函数。

这就是我创建和运行任务的方式:

cts.Cancel()(在单独的线程上)被调用后,任务不会停止

我在 F# 中找到了一个可以解决问题的静态函数:

我确信应该有一个简单的 C# 解决方案,你能帮我吗?

0 投票
2 回答
774 浏览

c# - 请求 CancellationToken 时是否必须使用 CancellationTokenSource?

这个MSDN 示例可以不使用 来编写CancellationTokenSource,可以直接使用 CancellationToken。

可以直接使用 aCancellationToken还是不应该做的事情?我没有在 MSDN 上看到任何直接使用的示例,如果可以这样做的话,这会让我更加痛苦。

更新

下面的 Cod 使用一小组测试用例扩展了可接受的答案,这些测试用例证明它CancellationToken是不可变的,因此CancellationTokenSource如果需要控制令牌,则必须使用它。

值得一提的是CancellationTokenSource ,每次调用时 Token 属性都会返回新对象

0 投票
2 回答
473 浏览

c# - Parallel.ForEach CancellationTokenSource 未停止

我目前正在编写一个 ProxyChecker 库。我正在使用一个有趣的 Parallel.ForEach 循环来检查所有代理的线程。我正在使用CancellationTokenSource(cts) 进行软中止(使用cts.Cancel())。正如您在下面的代码中看到的那样,我添加了一些“测试代码”,它将当前线程写入控制台。

这是您需要的代码:

输出(我去掉了几行,因为给你完整的代码是没用的)

然后它停在 4 或 3 或 2 (每次不同)。我等了几分钟,但在 Parallel.ForEach 执行后它并没有关闭,也没有代码。

请求的超时时间为 5000,线程数为 50。

这是用于检查的其他代码:

停止功能:

重要编辑:

我将此添加到 CeckProxy 函数中:

这是最后几个线程的结果:

为什么这么长?我的意思是180秒?!

0 投票
1 回答
13153 浏览

c# - 使用 CancellationToken 取消 SQL Server 查询

我在 SQL Server 中有一个长时间运行的存储过程,我的用户需要能够取消它。我编写了一个小型测试应用程序,如下所示,证明该SqlCommand.Cancel()方法运行良好:

调用后cmd.Cancel(),我可以验证底层存储过程是否立即停止执行。鉴于我在我的应用程序中大量使用了 async/await 模式,我希望SqlCommand获取CancellationToken参数的异步方法同样能够正常工作。Cancel()不幸的是,我发现调用CancellationToken导致InfoMessage事件处理程序不再被调用,但底层存储过程继续执行。我的异步版本测试代码如下:

我是否遗漏了CancellationToken应该如何工作的东西?我在 .NET 4.5.1 和 SQL Server 2012 上,以防万一。

编辑:我将测试应用程序重写为控制台应用程序,以防同步上下文是一个因素并且我看到相同的行为 - 调用CancellationTokenSource.Cancel()不会停止底层存储过程的执行。

编辑:这是我调用的存储过程的主体,以防万一。它以一秒的间隔插入记录并打印结果,以便轻松查看取消尝试是否及时生效。

0 投票
3 回答
5054 浏览

c# - Task.Factory.FromAsync 与 CancellationTokenSource

我有以下代码行用于从 NetworkStream 异步读取:

我想让它支持取消。我看到我可以使用 CancellationTokenSource 取消任务,但是我看不到任何可以将其传递给TaskFactory.FromAsync()的方法。

是否可以使 FromAsync() 构造的任务支持取消?

编辑:我想取消一个已经在运行的任务。