只需要“最近”任务 - 取消/忽略的最佳实践?

2024-01-03

我有一个看起来像这样的任务:

var task = Task.Factory.StartNew <object>(LongMethod);
task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext());

LongMethod 调用一个长时间运行的服务,在此期间我不能(或者至少我认为我不能)不断轮询取消令牌以查看它是否已被取消。但是,我对“取消”或忽略回调方法感兴趣。

当任务回调被调用时,我只对“结果”感兴趣if它来自最近的任务(让我们假设 LongMethod 调用的服务保留顺序,并且还假设用户可以多次单击该按钮,但只有最新的一个是相关的)。

我按以下方式修改了代码:创建任务后,将其添加到堆栈顶部。在 TaskCallback 中,我检查传递给回调的任务是否是最新的任务(即堆栈顶部的 TryPeek)。如果不是,我就忽略结果。

private ConcurrentStack<Task> _stack = new ConcurrentStack<Task>();

private void OnClick(object sender, ItemClickEventArgs e)
{
    var task = Task.Factory.StartNew < object >( LongMethod);
    task.ContinueWith(TaskCallback, TaskScheduler.FromCurrentSynchronizationContext());
    _stack.Push(task);
 }


private void TaskCallback(Task<object> task)
{
    Task topOfStack;
    if(_stack.TryPeek(out topOfStack)) //not the most recent
    {
        if (task != topOfStack) return;
    }
    //else update UI
}

我非常确定这不是一个“最佳实践”解决方案。但什么是?传递和维护取消令牌似乎也不是那么优雅。


我个人认为以下方法是最优雅的:

// Cancellation token for the latest task.
private CancellationTokenSource cancellationTokenSource;

private void OnClick(object sender, ItemClickEventArgs e)
{
    // If a cancellation token already exists (for a previous task),
    // cancel it.
    if (this.cancellationTokenSource != null)
        this.cancellationTokenSource.Cancel();

    // Create a new cancellation token for the new task.
    this.cancellationTokenSource = new CancellationTokenSource();
    CancellationToken cancellationToken = this.cancellationTokenSource.Token;

    // Start the new task.
    var task = Task.Factory.StartNew<object>(LongMethod, cancellationToken);

    // Set the task continuation to execute on UI thread,
    // but only if the associated cancellation token
    // has not been cancelled.
    task.ContinueWith(TaskCallback, 
        cancellationToken, 
        TaskContinuationOptions.NotOnCanceled, 
        TaskScheduler.FromCurrentSynchronizationContext());
}

private void TaskCallback(Task<object> task)
{
    // Just update UI
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

只需要“最近”任务 - 取消/忽略的最佳实践? 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Swift 中的 import func、struct、class 和 @_exported 是什么?

    在 Apple 的 github 中 他们使用 Swift 包管理器 import func POSIX isatty import func libc strerror r import var libc EINVAL import va
  • 理解Python中DataFrame的执行

    我是 python 新手 我想了解如何在 DataFrame 中执行 让我们用 kaggle com 中找到的数据集的示例来尝试一下 泰坦尼克号 灾难中的机器学习 我想要将 NaN 值替换为相应性别的mean IE 男性的 NaN 值应替换
  • Svelte:如何处理组件中自定义可写存储的异步初始化承诺?

    我有几个 Svelte 组件和一个自定义可写存储 店里有一个init函数是async并用一些 REST API 的数据库表的数据填充存储的值 我的组件都必须使用自动订阅来订阅该商店 订阅时 init必须被调用 总体思路是在数据库上实现 CR
  • 我的堆是否碎片化

    0 000 gt dumpheap stat total 1755874 objects Statistics MT Count TotalSize Class Name 7b9b0c64 1 12 System Windows Forms
  • 如何解决flywaydb中脚本的版本号冲突

    我有 3 个 git 分支 develop fixbug 和 master 分支master中最新的FlywayDB脚本版本是1 2 43 分支开发中的版本是1 2 54 Branch Fixbug的脚本版本更新至1 2 55 并且基于Br
  • 当用户选择文件夹时,Mac 沙盒应用程序可以访问什么?

    我正在阅读有关 Mac 应用程序沙箱的内容 并且想知道当用户在 NSOpenPanel 或 NSSavePanel 中选择文件夹时到底会发生什么 这 应用程序沙箱设计指南 http developer apple com library m
  • 在 Android 2 (API 5) 中模拟堆栈视图?

    我的应用程序必须有一个可以显示卡片的小部件 并且用户可以翻 cards StackWidget示例 在 Android 的资源中 有一个很好的小部件 但有一个StackView在小部件的布局中 它可以使用API Level 11我必须实现
  • 当对象属性不正确时 Wcf (400) 错误请求

    我有一个 Wcf 启用 ajax 服务 它接受方法调用的对象 我的 Wcf 方法如下所示 OperationContract XmlSerializerFormat WebInvoke Method POST UriTemplate XML
  • 构造函数 Service(URL, QName, WebServiceFeature[]) 未定义

    I got 构造函数 Service URL QName WebServiceFeature 是未定义错误在我为我的客户端 Web 服务运行 wsimport 后 我使用 JDK 1 6 请帮忙 在使用 wsimport 生成 JAX WS
  • 为什么 Socket.io 在 Safari 和 Chrome 上的连接速度很慢

    我是 Node js 和 Socket io 的真正新手 所以如果这是一个愚蠢的问题 请耐心等待 我在 Heroku 上设置了一个非常基本的虚拟对象来测试 Socket io 您所能做的就是单击一个按钮 所有连接的浏览器都会看到相应的消息
  • 提交 DataContext 更改时发生 Linq ChangeConflictException

    System Data Linq ChangeConflictException 2 of X updates failed at System Data Linq ChangeProcessor SubmitChanges Conflic
  • 如何在 Tumblr 上添加标签云?

    我已经使用 Tumblr 有一段时间了 但我不知道如何在博客上显示 Tumblr 标签云 我想问一下如何在我的Tumblr博客上显示标签云 第三方 JavaScript 解决方案 http rive rs projects tumblr t
  • 将单元格拆分为不同数量的单元格 - Excel

    如果回答了类似的问题 我们深表歉意 我进行了搜索 但找不到我要找的东西 我有一个电子表格 在其中复制并粘贴了有关各种类型啤酒的大量数据 我想将包含文本的字符串单个单元格拆分为与啤酒类型和酒精百分比相对应的任意数量的单元格 我遇到的问题是 有
  • 每(x)个JAVA插入一个空格,使用正则表达式

    我想知道正则表达式是否可以做到这一点 或者我应该将其分成一个字符数组并执行循环 在他们输入的字符串中每隔 x 个字符 由用户指定 插入一个空格 例如 他们有字符串 oogabooga 他们首先想每 2 个字符插入一个空格 他们会得到 oo
  • 使用 Retrofit 将 JSON 属性简单自定义映射到对象属性

    在 RetroFit 中定义 JSON 属性到特定对象属性的自定义映射的最简单方法是什么 一组 奖励 的 JSON 响应示例 name 5 Voucher description Get 5 off your next purchase a
  • 授予 Kubernetes 服务帐户权限以从所有命名空间获取 pod

    我想授予 Kubernetes 服务帐户执行权限kubectl token token get pod all namespaces 我熟悉对单个名称空间执行此操作 但不知道如何对所有名称空间执行此操作 包括将来可能创建的新名称空间且无需授
  • vim表格插件问题

    Before stallone Factory user name gt Sylvester age gt 64 schwarzenegger Factory user name gt Arnold age gt 63 一些魔法 After
  • 如何在 ReSharper 中添加自定义代码分析

    我是 ReSharper 的新手 对于使用Resharper的人来说 有没有办法添加自定义代码分析规则 例如我可能有一条规则说所有私有变量都应以字母 m 开头 如何将其添加到 Resharper 以便如果我违反此规定 它可以显示为警告或错误
  • BFS 和 DFS 的区别

    我正在读关于DFS in 算法简介由科门 以下为正文 片段 与 BFS 不同 BFS 的前驱子图形成一棵树 DFS产生的subgrpah可能由几棵树组成 因为 可以从多个来源重复搜索 除上述注释外 还提到以下内容 BFS 仅限于一个源 这似
  • 只需要“最近”任务 - 取消/忽略的最佳实践?

    我有一个看起来像这样的任务 var task Task Factory StartNew LongMethod task ContinueWith TaskCallback TaskScheduler FromCurrentSynchron