- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑一个场景,您有一些异步工作要完成,您可以在“一劳永逸”模式下运行它。此异步工作能够监听取消,因此您将取消 token 传递给它以便能够取消它。
在给定的时间,我们可以决定请求取消正在进行的事件,方法是使用我们从中获取取消 token 的取消 token 源对象。
因为取消 token 源实现 IDisposable
,我们应该称它为Dispose
就我们完成它的方法而言。这个问题的重点是准确地确定 当您已经完成了给定的取消 token 源。
假设您决定通过调用 Cancel
来取消正在进行的工作。取消 token 来源的方法:在调用 Dispose
之前是否需要等待正在进行的操作完成? ?
换句话说,我应该这样做:
class Program
{
static void Main(string[] args)
{
var cts = new CancellationTokenSource();
var token = cts.Token;
DoSomeAsyncWork(token); // starts the asynchronous work in a fire and forget manner
// do some other stuff here
cts.Cancel();
cts.Dispose(); // I call Dispose immediately after cancelling without waiting for the completion of ongoing work listening to the cancellation requests via the token
// do some other stuff here not involving the cancellation token source because it's disposed
}
async static Task DoSomeAsyncWork(CancellationToken token)
{
await Task.Delay(5000, token).ConfigureAwait(false);
}
}
class Program
{
static async Task Main(string[] args)
{
var cts = new CancellationTokenSource();
var token = cts.Token;
var task = DoSomeAsyncWork(token); // starts the asynchronous work in a fire and forget manner
// do some other stuff here
cts.Cancel();
try
{
await task.ConfigureAwait(false);
}
catch(OperationCanceledException)
{
// this exception is raised by design by the cancellation
}
catch (Exception)
{
// an error has occurred in the asynchronous work before cancellation was requested
}
cts.Dispose(); // I call Dispose only when I'm sure that the ongoing work has completed
// do some other stuff here not involving the cancellation token source because it's disposed
}
async static Task DoSomeAsyncWork(CancellationToken token)
{
await Task.Delay(5000, token).ConfigureAwait(false);
}
}
IDisposable
主题是我总是倾向于遵守一个类的暴露契约,换句话说,如果一个对象声称是一次性的,我更喜欢总是调用
Dispose
当我完成它时。我不喜欢根据类的实现细节来猜测是否真的需要调用 dispose 的想法,这些实现细节可能会在 future 的版本中以未记录的方式发生变化。
最佳答案
确保 CTS ( CancellationTokenSource
) 与即发即弃 Task
关联最终将被处置,您应该为任务附加一个延续,并从延续内部处置 CTS。但是这会产生一个问题,因为另一个线程可以调用 Cancel
处理对象时的方法,并根据 documentation Dispose
方法不是线程安全的:
All public and protected members of
CancellationTokenSource
are thread-safe and may be used concurrently from multiple threads, with the exception ofDispose()
, which must only be used when all other operations on theCancellationTokenSource
object have completed.
Cancel
和
Dispose
来自两个不同的线程同时没有同步不是一种选择。这只剩下一个选项可用:围绕 CTS 类的所有公共(public)成员添加一层同步。不过,这不是一个令人愉快的选择,原因如下:
using
中声明,只是让垃圾收集器来做保留资源的回收。这意味着你必须不服从
this部分文档:
Always call Dispose before you release your last reference to the
CancellationTokenSource
. Otherwise, the resources it is using will not be freed until the garbage collector calls theCancellationTokenSource
object'sFinalize
method.
The
CancellationTokenSource
class implements theIDisposable
interface. You should be sure to call theCancellationTokenSource.Dispose
method when you have finished using the cancellation token source to free any unmanaged resources it holds.
Task
类实现
IDisposable
接口(interface)也是,但处理任务实例
is not required .
关于c# - 处理取消 token 源的正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61359443/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!