问题标签 [cancellation]

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 回答
3095 浏览

c# - 如何正确取消 TPL 任务并继续

我有一个长时间运行的操作,我正在使用 TPL 将其放在后台线程上。AggregateException我目前的工作是什么,但我对在取消请求期间应该在哪里处理我感到困惑。

在按钮单击事件中,我开始我的过程:

DuplicateSqlProcsFrom(CancellationToken _token, SqlConnection masterConn, string _strDatabaseA, string _strDatabaseB, bool _bCopyStoredProcs = true, bool _bCopyFuncs = true)我的方法中

在按钮 Click 事件中(或使用delegate(buttonCancel.Click += delegate { / Cancel the Task / } ) I cancel theTask`,如下所示:

这捕获了OperationCanceledException方法中的罚款并打印了我的消息,但在上面DuplicateSqlProcsFrom提供的回调中总是; 应该取消!asyncDupSqlProcs.ContinueWith(task => { ... });task.StatusRanToCompletion

Cancel()在这种情况下,捕获和处理任务的正确方法是什么。我知道在CodeProjectMSDN 上的示例中显示的简单案例中这是如何完成的,但是在运行延续时我在这种情况下感到困惑。

在这种情况下如何捕获取消任务以及如何确保task.Status正确处理?

0 投票
1 回答
8577 浏览

android - Android Speex 回声消除问题

我在两个安卓设备之间有一个基本的 audiorecord-audiotrack、udp 数据包语音聊天。它有效,但我的回声很差。我正在尝试使用由 JNI 移植到 android 的 Speex 来消除回声。我导入的 speex 有效,但回声消除无效。本机 C 代码为:

还有一些重要的java代码:

问题是当我启动记录器/流媒体线程时,它向我显示它发送了一个包,然后应用程序崩溃而没有任何消息。您有什么建议或建议吗?请帮助我,因为我需要尽快完成这个项目,我已经努力工作并记录了自己,但它仍然不想很好地工作。谢谢!

编辑:我刚刚发现

正在触发崩溃。

0 投票
1 回答
2823 浏览

c# - AggregateException 中的 TaskCanceledException 不包含堆栈跟踪

我正在使用任务并行库来运行一个任务,该任务在取消时会引发 OperationCanceledException,然后使用 AggregateException 将其捕获,如下所示。AggregateException 包含一个 TaskCanceledExceptions 列表,它们对应于抛出的异常。不幸的是,这些 TaskCanceledExceptions 似乎正在丢失原始异常引发的堆栈跟踪。这是设计使然吗?

结果:

0 投票
1 回答
1058 浏览

c# - 使用 TPL 的多线程跨类取消

总之,我有一个长时间运行的进程,我使用任务并行库 (TPL) 在后台线程(支持取消)上运行。这个长期运行的任务的代码包含在Class Validation, 当方法

从运行Class Validation我可以很好地取消该过程。取消请求由适当的delegate(如下所示)处理,并且工作正常(我不相信这是我的问题的原因)。

当我从另一个类运行此方法时Class Batch,我通过“控制器”方法执行此操作

进而调用该方法

valForm我的访问者在哪里Class Validation,该方法运行良好,但是当我尝试取消时delegate

在哪里

冻结/挂起(没有未处理的异常等)_task.Wait()。这(我相信 - 通过测试)与我正在取消asyncControlMethod()已调用的事实有关valForm.AsyncRunValidationProcess(...),因此它正在取消asyncControlMethod()导致当前进程挂起。问题似乎在于将CancellationTokenSource等传递给子方法。该IsCancellationPending事件触发并终止控制方法,从而导致子方法挂起。

谁能告诉我我做错了什么或者(更相关地),我应该怎么做才能允许这样的取消程序?

注意:我试图生成一个子任务来运行valForm.AsyncRunValidationProcess(...)CancellationToken但它没有奏效。

谢谢你的时间。

0 投票
2 回答
1003 浏览

c# - 如何在 C# 中实现取消共享任务:s

总而言之,这是一个关于在 C# 中取消 Task:s 的复杂案例的设计/最佳实践的问题。如何实现共享任务的取消?

作为一个最小的例子,让我们假设以下内容;我们有一个长期运行的、可合作取消的操作“工作”。它接受一个取消标记作为参数,如果它被取消则抛出。它对某些应用程序状态进行操作并返回一个值。两个 UI 组件独立需要其结果。

在应用程序状态不变的情况下,应缓存 Work 函数的值,如果正在进行一次计算,则新请求不应开始第二次计算,而是开始等待结果。

任何一个 UI 组件都应该能够在不影响其他 UI 组件任务的情况下取消它的任务。

到目前为止你和我在一起吗?

以上可以通过引入一个Task缓存来完成,该缓存将真正的Work任务包装在TaskCompletionSources中,然后将其Task:s返回给UI组件。如果 UI 组件取消它的任务,它只会放弃 TaskCompletionSource 任务,而不是底层任务。这一切都很好。UI 组件创建 CancellationSource 和取消请求是一个正常的自上而下的设计,在底部有合作的 TaskCompletionSource 任务。

现在,到了真正的问题。应用状态发生变化时怎么办?让我们假设让“工作”函数在状态副本上运行是不可行的。

一种解决方案是监听任务缓存(或附近)中的状态变化。如果缓存有底层任务使用的 CancellationToken,即运行 Work 函数的任务,它可以取消它。这可能会触发所有附加的 TaskCompletionSources Task:s 的取消,因此两个 UI 组件都将获得 Canceled 任务。这是某种自下而上的取消。

有没有首选的方法来做到这一点?是否有一种设计模式可以在某处描述它?

可以实现自下而上的取消,但是感觉有点奇怪。UI 任务是使用 CancellationToken 创建的,但由于另一个(内部)CancellationToken 而被取消。此外,由于令牌不相同,因此不能仅在 UI 中忽略 OperationCancelledException - 这将(最终)导致在外部 Task:s 终结器中引发异常。

0 投票
1 回答
883 浏览

c++ - WIN32 Socket API: Canceling Send/Recv on socket using event-based completion notification

using socket with the overlapped operation selected the event-based completion notification; Have 2 events, one for data, the other to cancel long send/recv:

then calling WSASend,

followed by

which is setup to return on any one event signaled. Now assume send is in progress, and m_hInterruptEvent is signaled. WSAWaitForMultipleEvents returns, technically the function calling send can return as well and delete internally allocated buffers.

What is not clear to me, the WSASend may still be working in background, and deleting buffers will cause data corruption in best case.

What would be the proper way to stop the background Send/Receive, if the socket needs to be used for something else immediately?

I looked at the CancelIO(), but the MSDN never mentions it in relation to Sockets, does it work with file based IO only?

0 投票
1 回答
128 浏览

c - C程序中的Linux POSIX在取消线程中失败

我正在编写一个程序,它读取不同线程中的部分数据,然后在其中找到一个模式。

但在此之前(问题出现在下面的代码中)我只是想检查线程是否正确取消。这就是我卡住的地方。看到错误需要时间,但基本上在(有时 40 次)启动我的程序之后,它会挂在主线程的 while 循环中

...等待最后一个线程取消。

代码在这里: http: //pastebin.com/VqRrhXPD

我还提供了我正在读取的文件的内容。

开幕:

0 投票
1 回答
3529 浏览

c++ - 为什么 pthread_exit 会抛出被省略号捕获的东西?

如果被调用的函数pthread_create具有以下结构

为什么省略号的异常处理程序在执行时被调用pthread_exit?(请注意std::exception,例如,不会抛出)

0 投票
4 回答
19281 浏览

javascript - 可以取消 jQuery 延迟吗?

我有一种情况,我想取消延期。deferred 与 ajax 调用相关联。

为什么我使用延迟

我不使用 $.ajax 返回的普通 xhr 对象。我正在使用 jsonp,这意味着我不能使用 HTTP 状态代码进行错误处理,而必须将它们嵌入到响应中。然后检查代码并相应地将关联的延迟对象标记为已解决或拒绝。我有一个自定义 api 函数可以为我执行此操作。

为什么我要取消延期

有一个输入字段用作列表的过滤器,并会在键入结束后半秒自动更新列表。因为一次可能有两个 ajax 调用未完成,所以我需要取消前一个调用以确保它不会在第二个调用之后返回并显示旧数据。

我不喜欢的解决方案

  • 我不想拒绝延迟,因为这会触发附加的处理程序.fail()
  • 我不能忽略它,因为它会在 ajax 返回时自动标记为已解决或被拒绝。
  • 当 ajax 调用返回并尝试将 deferred 标记为已解决或已拒绝时,删除 deferred 将导致错误。

我该怎么办?

有没有办法取消延迟或删除任何附加的处理程序?

欢迎就如何修复我的设计提出建议,但将优先考虑找到删除处理程序或防止它们触发的方法。

0 投票
1 回答
1241 浏览

c# - 如何取消任务中的Web服务请求,并在取消发生时做一些事情

我们有一棵树,当用户点击任何节点时,它会从 Web 服务中查询数据,并替换结果。但是,有时需要时间。所以我尝试将 Web 服务调用包装在一个任务中。我想在任务尚未完成并且用户单击其他节点时取消任务。以下是我的示例代码。然而取消任务块不能被执行,即使 _cancelTokenSource.Cancel() 执行。MSDN 提供的大多数示例都是基于 CPU 限制的,而不是 I/O 限制的。谁能告诉我如何全部取消网络服务?提前致谢

}