问题标签 [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 回答
26299 浏览

c# - 如何找出已处置的对象?

我有一个多线程应用程序,并且 aCancellationToken用作共享对象。每个线程都可以触发它来告诉其他线程该作业被取消。然后一个线程进行清理并像这样处理每个对象CancellationToken。然后,如果一个线程尝试使用它,则会引发异常:

CancellationTokenSource 已被释放。

如何在使用之前找出对象已被处置?

0 投票
1 回答
1084 浏览

c# - 类似于 CancellationTokenSource 和 CancellationToken 模式的暂停线程的模式?

我开始使用 ConcellationTokenSource 和 CancellationToken 在框架 4.0 中提供的协作线程取消模式,我发现它非常有用且简单。

我现在的目的是为我的应用程序提供一个类似的优雅和简单的解决方案,但用于暂停线程而不是取消它们。因为同样在这种情况下,请求与收听暂停命令不同,所以我认为拥有像 PauseTokenSource 和 PauseToken 这样的东西会很好。所以我的第一个问题是,你是否建议这样一种合作暂停模式,或者它是否更好。

如果拥有这样的模式是个好主意,您对如何做到这一点有任何建议或指导吗?目前我认为源应该能够通过 ManualResetEvent 暂停和取消暂停,并且令牌应该具有对源的引用。它遵循初稿,我希望你能给我改进它的建议。

0 投票
5 回答
20613 浏览

c# - VS2010如何重置CancellationTokenSource并调试多线程?

我使用 CancellationTokenSource 提供了一个功能,以便用户可以取消冗长的操作。但是,在用户应用第一次取消后,后面的进一步操作不再起作用。我的猜测是 CancellationTokenSource 的状态已设置为 Cancel,我想知道如何将其重置。

  • 问题一:第一次使用后如何重置CancellationTokenSource?

  • 问题2:如何调试VS2010中的多线程?如果我在调试模式下运行应用程序,我可以看到语句的以下异常

    /li>

用户代码未处理 InvalidOperaationException 跨线程操作无效:控件“MainForm”从创建它的线程以外的线程访问。

谢谢你。

0 投票
1 回答
658 浏览

c# - 使用 TPL 为阻塞方法调用创建超时

我有一个阻塞的库调用,一个 imap Idle 将在一个长期运行的服务中等待电子邮件,我很偏执,不相信图书馆永远不会错过任何电子邮件。空闲调用可以通过对 StopIdle 的并发调用来取消。如果它认为它仍然空闲,我实现了以下方式来每分钟调用 StopIdle。

有没有更好的方法来执行以下操作?这种方法有效,但似乎我最终会占用一堆只是休眠的线程池线程。

0 投票
2 回答
872 浏览

c# - CancellationTokenSource 不当行为

我在使用 CancellationTokenSource 取消任务后等待任务时遇到问题。取消调用不会中断任务。当我等待任务时,主线程阻塞,因为任务永远不会被中断。

下面是我的程序的简短描述:一个任务增加一个 char 变量(从“A”到“Z”)并在 GUI 线程上显示它。为此,任务在创建控件的线程上执行委托 (this.invoke())。

一旦我注释掉 RefreshTextBox()-Function,取消调用就会起作用,任务将被中断。似乎 this.invoke() 命令阻止了任务中断。

在下面的代码中,我也用普通线程实现了相同的功能。然后我工作。任务实现和线程实现的区别在哪里?

0 投票
3 回答
36313 浏览

c# - 如何正确重置 CancellationToken?

今天早上我一直在玩,Async CTP并且有一个带有 abutton和 a的简单程序label。单击button它开始更新label,停止button它停止写入label. 但是,我不确定如何重置,CancellationTokenSource以便我可以重新启动该过程。

我的代码:

0 投票
1 回答
734 浏览

asynchronous - 异步和 CancellationTokens/CancellationTokenSource 内存问题

我仍在寻找内存泄漏,我注意到以下内容:

我有很多来自 F# 的默认取消令牌源(异步工作流)的 System.Threading.CancellationCallbackInfo-Objects 的实时实例。

如果您自己声明一个 Source 并在 MailboxProcessor 中使用它来跨越子级或任务,问题会变得更糟。

似乎 GC 无法收集那些跨越的任务/工作流,因为 CancellationTokenSource 持有这样的引用: 在此处输入图像描述

大多数 CancellationCallbackInfo-Objects 都进入了 Gen2 - 令人难以置信,因为我只是在 MailboxProcessors-“循环”工作流程中使用本地引用......

这是一个已知问题,是否有解决方案/解决方法?

现在我停止使用 Cancellation-support 并通过代码线程 ManualResetEvents ......一点都不好:(

0 投票
1 回答
1157 浏览

asp.net - 在 WCF 服务中返回值后如何继续处理

我有一个 WCF 服务,它依次调用其他几个 Web 服务。这些服务按优先顺序排序,但并行调用。每个服务都会以 true 或 false 进行响应,当所有响应都收到后,最喜欢的肯定会返回给客户端。

但是,在此期间的任何时候,最喜欢的服务都可能会做出积极的回应。此时继续查询其他服务没有意义,所以我希望取消执行并将结果返回给客户端。

我能做的就这么多:

上面的代码是我的代码的一个非常简化的版本,但本质上它会检查每个响应以查看它是否是当前最受欢迎的服务。如果是这样,它会取消循环。

但是...以这种方式取消循环将等待已经调用的任何服务在终止循环之前完成。任何服务都有可能超时,这当然被视为否定。如果只是其中一个超时,它会在我的响应时间上增加 10 秒。

我想做的是以下之一:

  1. 将首选服务返回给客户端,然后继续处理来自已经启动的服务的响应(这纯粹是为了记录目的,以便我知道这些服务的正/负率)。
  2. 立即取消循环并忘记剩余的响应。理想情况下,我不想这样做,因为这意味着将不会记录本应积极响应的服务,这将影响他们的偏好评级。

所以我的问题是:

我想要实现的目标可能吗?我意识到 parallel.foreach 可能不是这项工作的最佳工具,或者我可能无法在响应客户端后记录响应。最重要的要求是当“赢家”已经被选中时,客户端无需等待服务响应即可收到快速响应。

0 投票
1 回答
2982 浏览

c# - 一致取消 Async CancellationTokenSource 的最佳实践

所以我的 UI 上有一个组合框,它在 SelectionChanged 上异步转到 Web 服务,以拉回一些要在 UI 上显示的信息(使用新的 C#5 async/await 关键字)。我要做的是在发送新请求之前取消当前的异步请求;例如,如果用户使用键盘快速循环浏览所有组合框项目,则 SelectionChanged 事件可能会在第一个异步请求返回之前触发多次(生成多个异步请求)。

所以我从组合框的 SelectionChanged 事件中调用的异步函数如下所示:

Connections 是一个会触发并访问 Web 服务的属性。所以因为 CancellationTokenSource 一旦取消就不能重用,我正在考虑这样做:

但问题是,有时我会在没有运行异步命令时调用 Cancel()(例如,第一次调用此函数时);因此,如果我连接任何取消事件处理程序,即使在我发出异步请求之前,它们也会被调用。

无论如何要检查异步请求是否已经在运行?除了我做类似的事情:

我有几个异步函数都使用相同的 CancellationTokenSource,所以我必须在所有这些函数中实现这个“管道”。这是最好的方法吗?或者,还有更好的方法?

此外,如果我公开 _cancellationTokenSource 以便其他类可以注册取消委托,那么将这些委托“转移”到新的 CancellationTokenSource 的最佳方法是什么,因为我每次都创建一个新委托?

提前致谢!

0 投票
1 回答
269 浏览

task - CancellationTokenSource vs 手动结束任务

说我创建一个任务

通过全局布尔值退出任务是否更好地退出任务?

还是使用 CancellationTokenSource 更好?

什么时候适合使用 CancellationTokenSource 结束任务?

当您使用 CancellationTokenSource 并使事物处于不一致状态时,它是否只是抛出异常?

谢谢