- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
背景:
我有一个启动长时间运行(和无状态)任务的网络应用程序:
var task = Task.Run(() => await DoWork(foo))
task.Wait();
因为它们运行时间很长,所以我需要能够从单独的 Web 请求中取消它们。
为此,我想使用 CancellationToken 并在 token 被取消后立即抛出异常。但是,根据我的阅读,任务取消是 cooperative ,这意味着任务正在运行的代码必须显式检查 token 以查看是否已发出取消请求(例如 CancellationToken.ThrowIfCancellation()
)
我想避免在整个地方检查 CancellationToken.ThrowIfCancellation()
,因为该任务很长并且要经过许多函数。我想我可以完成我想要创建一个显式 Thread
的任务,但我真的很想避免手动线程管理。也就是说……
问题:是否有可能在任务被取消时自动抛出异常,如果没有,是否有任何好的替代方法(模式等)来减少使用 CancellationToken.ThrowIfCancellation()
污染代码?
我想避免这样的事情:
async Task<Bar> DoWork(Foo foo)
{
CancellationToken.ThrowIfCancellation()
await DoStuff1();
CancellationToken.ThrowIfCancellation()
await DoStuff2();
CancellationToken.ThrowIfCancellation()
await DoStuff3();
...
}
我觉得这个问题与this one 有很大不同因为我明确要求一种方法来最小化检查取消 token 的调用,接受的答案对此响应“时不时地,在函数内部,调用 token.ThrowIfCancellationRequested()”
最佳答案
Is it possible to automatically throw an exception in the task when it has been canceled, and if not, are there any good alternatives (patterns, etc.) to reduce polluting the code with CancellationToken.ThrowIfCancellation()?
没有,也没有。所有取消都是合作的。取消代码的最佳方式是让代码响应取消请求。这是唯一好的模式。
I think I can accomplish what I want creating an explicit Thread
不是真的。
此时,问题是“如何取消不可取消的代码?”答案取决于您希望系统的稳定性:
Thread
中运行代码,并在不再需要时Abort
线程。这是最容易实现的,但在应用程序不稳定方面也是最危险的。坦率地说,如果您曾在应用中的任何位置调用 Abort
,除了心跳/smoketest 检查等标准做法之外,您还应该定期重启该应用。AppDomain
中运行代码,并在不再需要该 AppDomain 时卸载
。这更难实现(您必须使用远程处理),并且在 Core 世界中不是一个选项。事实证明,AppDomain
甚至没有像预期的那样保护包含应用程序,因此任何使用此技术的应用程序也需要定期重启。进程
中运行代码,并在不再需要时杀死
该进程。这是实现起来最复杂的,因为您还需要实现某种形式的进程间通信。但它是取消不可取消代码的唯一可靠的解决方案。如果您放弃不稳定的解决方案 (1) 和 (2),那么唯一剩下的解决方案 (3) 就是吨的工作 - 方式,远远超过使代码可取消。
TL;DR:只需按照设计使用的方式使用取消 API。这是最简单有效的解决方案。
关于c# - 使用 CancellationToken 取消任务而不在任务中明确检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57171975/
我在 linux 上工作。我对windows没有太多想法。 windows中文件的权限是如何组织的?我们在unix中是否有像chmod这样的api来更改权限? 最佳答案 对于 Windows,有一个名
应用程序编程接口(interface) (API) 是一组用于访问基于 Web 的软件应用程序的编程指令和标准。 如果出现 ,有人可以向我解释一下吗?谷歌地图 或 优酷 这是API哪个是softwar
我有两个应用程序,A 和 B,它们使用 android 库 C。B 有一个服务 A 想通过 C 使用,例如 在我的库中有一个类试图将它绑定(bind)到服务,
我正在正常或安全模式下启动相机应用程序,具体取决于使用我的应用程序执行的手势,但一旦用户选择应用程序并点击始终,则没有选项可以更改默认值,即使是从 Android 的设置菜单中也是如此. camera
我有一个数据集,本质上是一个稀疏二进制矩阵,表示两个集合的元素之间的关系。例如,让第一组是人(用他们的名字表示),例如像这样的东西: people = set(['john','jane','mike
何为pythonic? pythonic如果翻译成中文的话就是很python。很+名词结构的用法在中国不少,比如:很娘,很国足,很CCTV等等。 我的理解为,很+名词表达了一种特殊和强调的意味。
某些 Prolog 目标的确定性成功问题已经一次又一次地出现在 - 至少 - 以下问题: Reification of term equality/inequality Intersection an
我指的是 DateTime.TryParse(string s, out DateTime result) 重载,它尝试从字符串中解析 DateTime - 没有特定的格式正在指定。 我可以从http
2020 年 04 月 10 日,《中共中央国务院关于构建更加完善的要素市场化配置体制机制的意见》正式公布,将数据确立为五大生产要素(土地、资本、劳动力以及技术)之
有人可以解释一下 NSNotification 的 addObserver 函数中 notificationSender 的用途吗? 这是 Apple 文档的解释: notificationSende
我是一名优秀的程序员,十分优秀!