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

c# - 处理 CancellationTokenSource 及其子 CancellationTokenRegistration

是否还会处理通过 获得Dispose()CancellationTokenSource任何子CancellationTokenRegistration对象Token.Register()?还是我必须单独处理每个注册?

示例 1:

示例 2:

0 投票
1 回答
2832 浏览

c# - CancellationToken - 请求取消后注册处理程序

在没有搭建快速试验台的情况下;我想我会很快问 SO 看看是否有人知道这个答案。

此外,它还可能具有通知可能遇到类似情况的其他用户的额外好处。

假设我有一个长期存在的 CancellationTokenSource,其中有许多不同的组件在 CancellationToken 上注册处理程序。

如果请求取消并且注册的回调都被调用,然后在该点之后注册另一个处理程序;取消回调是否仍然会在注册时为该新回调触发?

提前干杯!

0 投票
2 回答
5193 浏览

c# - 按时间取消任务

我有一个多线程应用程序,我需要在一定时间后取消每个任务,即使在取消时,它们使用非托管资源。现在我使用以下代码(例如,控制台应用程序)。在实际应用中,延迟可能发生在非托管资源中。

得到结果:

在此处输入图像描述

但从安全的角度来看,我不确定它是否适合实际应用。我还在不同的变体中使用了 CancellationToken,但它并没有给我正确的结果,因为我在使用带有时间跨度的 CancellationToken 或 .Delay() 并在一定时间后取消任务时,我得到了以下结果:

在此处输入图像描述

在这种情况下,必须取消所有任务,因为 Thread.Sleep() > 分配了执行每个任务的时间。但是我们可以看到执行的一些时间。

我还使用以下构造并给出相同的结果:

在此处输入图像描述

我还使用 Parallel 并在方法 Do() 内部初始化 Cancellation Token,并使用 Timer 在时间跨度后取消令牌,但都给出相同的结果。

那么,为什么会发生这种情况以及在一定时间后取消任务的正确方法是什么???

0 投票
0 回答
186 浏览

c# - 如何与两个 DLL 共享一个取消令牌?

我在FIRST dll中有以下代码:

方法类classASECOND dll中:

然后,我的方法 FuncAsync 在控制台应用程序中被调用:

第一个DLL包括第二个,控制台应用程序包括第一个DLL。

这段代码编译得很好,没有警告,没有错误。但是在执行时,行错误: Save(a, b, ct);

Additional information: Could not load type 'ProgressHandler' from assembly 'A.B.C, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' because the method 'func' has no implementation (no RVA).

如果我从代码中删除 CancellationToken,一切正常。

如何将我的 CancellationToken 从应用程序发送到 DLL1,然后从 DLL1 发送到 DLL2?

编辑 :

我忘了准确地说,我只使用以下命令将两个 DLL 合并为一个:

当我不合并库时,我的代码中没有错误。

0 投票
2 回答
72 浏览

c# - 取消同时执行的方法之一

我正在使用 Task.WaitAny 同时调用 3 种不同的方法(TrySolution1、TrySolution2 和 TrySolution3)。我的要求是找到首先执行哪个方法并中止/取消其他方法的执行,如果第一个方法返回结果。

尝试使用 CancellationTokenSource 在第一个方法执行后取消其他任务,但可以看到其他方法仍在执行。

我的代码片段:

0 投票
5 回答
12744 浏览

c# - 在键盘事件中使用 CancellationToken 调用 Task.Delay 时出现 TaskCanceledException

我试图延迟处理从 WinRT 中的键盘事件调用的方法(示例中为 SubmitQuery()),直到在一段时间内(在本例中为 500 毫秒)没有进一步的事件。

我只希望 SubmitQuery() 在我认为用户完成输入时运行。

使用下面的代码,我在 Task.Delay(500,cancellationToken.Token); 时不断收到 System.Threading.Tasks.TaskCanceledException 叫做。请问我在这里做错了什么?

0 投票
1 回答
5476 浏览

c# - 从按钮取消异步任务

我需要做的是能够取消正在异步运行的任务。

我一直在寻找,似乎无法绕开它。我似乎无法辨别它将如何实施到我当前的设置中。

这是我的代码,可以触发我的任务。任何有关在何处或如何实施取消令牌的帮助将不胜感激。

0 投票
2 回答
179 浏览

c# - 操作运行时异步取消

我正在.net 中开始一些关于异步编程的测试,现在我被困在尝试使用cancellationToken 取消长时间操作。

所以我有以下代码:

我的按钮开始操作

最后是我的操作

那么,如何取消 MyLongOperation() 方法?有可能吗?

0 投票
1 回答
1939 浏览

asynchronous - f# async 何时检查其 CancellationToken?

我正在阅读F# 以获取乐趣和利润 - 异步编程。在取消工作流程下,他们有以下示例:

关于这一点,他们说:

在 F# 中,任何嵌套的异步调用都会自动检查取消令牌!

在这种情况下,它是行:

从输出中可以看出,这一行是取消发生的地方。

但是,对我来说(VS2010、F# 2.0、F# Interactive)我得到以下输出。..after请注意在我取消令牌后它是如何打印的。他们只是错了吗?

所以也许在进入 时检查取消Async.Sleep?不,那么它会打印:

所以看起来检查实际上是在for循环中!即它一直运行,直到被取消后的for循环。这是它的工作原理吗?那么如果我希望它在睡眠后检查呢?

这个问题似乎暗示了我上面描述的取消工作:我可以显式检查取消/终止异步计算吗?

编辑:关于这是否仅在 FSI 2.0 中:如果一个循环分别睡 200 毫秒、2500 毫秒和 4000 毫秒,会发生什么情况?它打印在中间吗?

0 投票
1 回答
2786 浏览

c# - 处理异步方法的取消

我正在使用Parse作为应用程序的数据存储,并且我正在实现他们的Facebook 登录功能。AFAIK,此登录方法与其他异步方法没有任何不同,因此希望它适用。

因此,有一个 Login.xaml 页面,其中有一个“使用 Facebook 登录”按钮,点击此按钮会将您带到 FacebookLogin.xaml 页面,该页面仅包含WebBrowser链接的 Parse 文档中的控件。在ContentPanel.LoadedFacebookLogin.xaml 中,我可以使用以下代码登录:

如果我真的登录,它可以工作,我可以将用户导航到下一页。当我让浏览器控件加载(因此async方法正在等待),然后点击“后退”按钮,然后再次返回 Facebook 登录页面时,就会出现问题。

当我这样做时,OperationCancelledException会抛出一个,但我不知道如何处理它。我试过的:

  1. catchfor 中OperationCanceledException,将控件重新初始化WebBrowser为一个新的。这没有效果。

  2. 同样catch,再次调用FacebookLogin(),重试。这也没有奏效。

  3. 我也尝试过不使用await和返回 aTask<ParseUser>但我也不知道该怎么做。

我可以对取消异常做些什么,或者使用 aCancellationToken来更好地处理这个问题?我只想正确处理取消,以便在用户按“返回”时重新加载 Facebook 登录页面。

解决方案:

好的,经过@JNYRanger 的大量指导,我想出了一个可行的解决方案。可能有更好的方法,但这似乎有效。以下是我的 FacebookLogin.xaml 中的完整代码:

所以基本上,当按下“返回”时,我使用CancellationToken来请求取消,这会引发异常。当异常发生时,我设置task为null。现在,当重新导航到 FacebookLogin 页面(之前没有登录)时,task可以成功重新创建。