任务并行库 - 如何使用 TaskContinuationOptions.OnlyOnCanceled 来触发延续?

2024-04-10

我正在尝试 .NET 4.0 中的任务支持 - 特别是延续支持。我感到困惑的是我不知道如何继续TaskContinuationOptions.OnlyOnCanceled标志设置为执行。如果我做一个ThrowIfCancellationRequested在我的工作例程中,它似乎只是作为错误而不是取消操作从延续中传播出来。例如,给定以下代码:

using System;
using System.Threading;
using System.Threading.Tasks;

namespace TaskExp1
{
    class Program
    {
        static void Main()
        {
            var n = 10000;

            DumpThreadId("main method");

            var cts = new CancellationTokenSource();
            var task = Task.Factory.StartNew<int>(_ => Sum(cts.Token, n), 
                                                  cts.Token);

            task.ContinueWith(t =>
            {
                DumpThreadId("ContinueWith Completed, ", newline:false);
                Console.WriteLine("The result is " + t.Result);
            }, TaskContinuationOptions.OnlyOnRanToCompletion);

            task.ContinueWith(t =>
            {
                DumpThreadId("ContinueWith Faulted, ", newline: false);
                Console.WriteLine(t.Exception.InnerExceptions[0].Message);
            }, TaskContinuationOptions.OnlyOnFaulted);

            task.ContinueWith(_ =>
            {
                DumpThreadId("ContinueWith Cancelled, ");
            }, TaskContinuationOptions.OnlyOnCanceled);

            Console.WriteLine("Computing sum of " + n + " ...");
            Thread.SpinWait(100000);
            cts.Cancel();

            Console.WriteLine("Done.");
            Console.ReadLine();
        }

        static int Sum(CancellationToken cancelToken, int n)
        {
            DumpThreadId("from Sum method");
            int sum = 0;
            for (; n > 0; n--)
            {
                Thread.SpinWait(500000);
                if (n == 10000) cancelToken.ThrowIfCancellationRequested();
                checked { sum += n; }
            }
            return sum;
        }

        static void DumpThreadId(string msg = "", bool newline = true)
        {
            var formattedMsg = String.Format("ThreadId: {0} {1}", 
                                  Thread.CurrentThread.ManagedThreadId, msg);
            if (newline) formattedMsg += "\n";
            Console.Write(formattedMsg);
        }
    }
}

这输出:

ThreadId: 9 main method
Computing sum of 10000 ...
Done.
ThreadId: 10 from Sum method
ThreadId: 10 ContinueWith Faulted, The operation was canceled.

如何退出我的工作程序(Sum)方法,以便OnlyOnCanceled继续被解雇?


当您使用 _ => lambda 表达式时,您正在使用

Func<Object, TResult> function, Object state

超载。如果将 Factory.StartNew 更改为

Task.Factory.StartNew<int>(() => Sum(cts.Token, n), cts.Token);

它将调用“ContinueWith Cancelled”。

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

任务并行库 - 如何使用 TaskContinuationOptions.OnlyOnCanceled 来触发延续? 的相关文章

随机推荐

  • 在开发过程中使用 Django、South 和 Sqlite [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是 Python 2 7 和 Django 1 5 的新手 正在研究姜戈书 http www djangobook com 同时制作一个
  • EJB 3.1 事务、EntityManager

    我有一个通过 smack 基于事件的 java 库 处理 IQ 节的应用程序 我们现在从 vanilla Tomcat 切换到 glassfish 3 1 我想切换到 ejb 3 1 Stateless public class Dispa
  • 来自多个多元回归输出的汇总数据框

    我正在做多个 OLS 回归 我使用了以下 lm 函数 GroupNetReturnsStockPickers lt read csv GroupNetReturnsStockPickers csv header TRUE sep dec M
  • IIS 上的 Glimpse.axd 403ing

    当我发布到 IIS 7 5 后尝试访问 Glimpse axd 时 我现在收到 403 Forbidden 响应 IIS 中是否有设置禁止访问 axd 文件 或者这完全是另外一回事 这通常是由于 Glimpse 的 web config 部
  • FastAPI 上的事件处理程序

    我正在研究最适合我的目的的网络框架 我们将开发多个微服务 并且需要在一些微服务上调度事件 这些事件可以在其他微服务上监听 使用 FastAPI 是否有支持 如果没有 有没有办法监听数据库事件操作 我看到了 app on event shut
  • 在多个 Excel 实例之一中查找工作簿

    我在 Outlook VBA 中有一个宏 用于从打开的 Excel 工作簿 Workbook1 中获取数据 我参考工作簿如下 Dim objApp As Excel Application Set objApp GetObject Exce
  • Django 管理内联表单,具有只读旧值并允许添加新的内联值

    我正在尝试解决这个问题 但由于某种原因 到目前为止每次尝试都失败了 我有两个简单的模型 问题和答案 class Question models Model phoneID models CharField max length 255 ed
  • 在文本框中,保护第一个单词,但允许添加/编辑这些单词之后的文本

    因此 我有一个 C 文本框 使用 NET 表单 我将在其中接受用户字符串作为某些输入 该字符串的开头已经有文本 参数 无论如何 这些文本都将存在于该字符串的开头 它一定在那里 我希望他们意识到这一点 但无法从文本框中删除这些单词 所以他们不
  • 将 Autofac 与 ASP.Net Core 3.1 通用主机“Worker Service”应用程序结合使用

    在 ASP Net Core 应用程序中 可以使用以下方式轻松配置 Autofac public class Program public static void Main string args ASP NET Core 3 0 The
  • Paper.js:无法设置符号实例的 fillColor

    我是 paper js 的新手 对于这个项目 我需要一个将在许多实例中使用的形状 具有不同的填充颜色 因此显然使用符号更好 而不是使用 Path clone 方法 但是 一旦我将符号实例化为 PlacedSymbol 更改 fillColo
  • 如何使用“input()”在控制台中重复输入选项,直到用户选择退出?

    我向用户提供多个选项以供选择使用input 在Python 3中 我希望一次又一次地显示选项 直到用户选择退出选项来退出 例如 a 5 b 2 inp input Please choose from Options mentioned b
  • 每 100 秒垃圾收集一次

    有没有人遇到过这样的场景 高内存分配负载下的应用程序每 100 秒执行一次第二代收集 我们使用具有 8 16 GB 物理内存的 64 位服务器 应用程序有几 GB 的数据存储在缓存中 并且无法从中清除 因为它实际上已被应用程序使用 此外 它
  • Java 中 File.exists() 的替代方法

    我从没想过这种事会发生在我身上 但我遇到了 Java 中的第一个错误 https bugs java com bugdatabase view bug bug id 5003595 https bugs java com bugdataba
  • 如何获得自定义警报对话框,如图所示?

    i want to build a customized dialog just like the one shown in image 我创建了两个布局 一个用于自定义标题 另一个包含两个编辑文本视图和两个按钮 这里是 xml 自定义标题
  • 如何在Visual Studio中动态创建解决方案的解决方案文件夹?

    我想创建一个新的解决方案文件夹使用 PowerShell 脚本在 Visual Studio 中动态地进行操作 我知道如何在 Visual Studio 中手动为现有解决方案创建解决方案文件夹 但有没有办法可以使用 PowerShell 自
  • JavaScript html 解码

    当我在 asp net 应用程序中通过 ajax 接收 html 文本时 它看起来像 lt span 20style color green font weight bold gt 20Text 20Msg lt span gt javas
  • 准备语句将逗号分隔值传递给存储过程参数

    我无法将查询移动到存储过程中 我需要将逗号分隔的字符串传递给参数yr model no两个人IN条款 我已经阅读了一些线程并决定使用准备语句 原始查询可以很好地获取多行 但是在存储过程中 当我用call load things 128394
  • Rails 中带有回退功能的动态命名空间控制器

    我对新的 Rails 应用程序有一个有点奇怪的要求 我需要构建一个应用程序 其中所有路由都在多个命名空间中定义 让我解释一下 我想要一个应用程序 其中学校科目 数学 英语等 是命名空间 w math english each do subj
  • void 子例程返回什么?

    我刚刚对pluralsight 进行评估 并得到了以下问题 无效子程序返回什么 我的印象是无效子例程没有返回任何内容 但这不是提供的答案之一 多项选择题 Net 在后台返回值类型还是这个问题不正确 我得到的选择是 整数 布尔值 细绳 约会时
  • 任务并行库 - 如何使用 TaskContinuationOptions.OnlyOnCanceled 来触发延续?

    我正在尝试 NET 4 0 中的任务支持 特别是延续支持 我感到困惑的是我不知道如何继续TaskContinuationOptions OnlyOnCanceled标志设置为执行 如果我做一个ThrowIfCancellationReque