Task.IsCancelled 不起作用

2024-04-03

我有以下示例代码:

static class Program
{
    static void Main()
    {
        var cts = new CancellationTokenSource();

        var task = Task.Factory.StartNew(
            () =>
                {
                    try
                    {
                        Console.WriteLine("Task: Running");
                        Thread.Sleep(5000);
                        Console.WriteLine("Task: ThrowIfCancellationRequested");
                        cts.Token.ThrowIfCancellationRequested();
                        Thread.Sleep(2000);
                        Console.WriteLine("Task: Completed");
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine("Task: " + exception.GetType().Name);
                        throw;
                    }
                }).ContinueWith(t => Console.WriteLine("ContinueWith: cts.IsCancellationRequested = {0}, task.IsCanceled = {1}, task.Exception = {2}", cts.IsCancellationRequested, t.IsCanceled, t.Exception == null ? "null" : t.Exception.GetType().Name));

        Thread.Sleep(1000);

        Console.WriteLine("Main: Cancel");
        cts.Cancel();

        try
        {
            Console.WriteLine("Main: Wait");
            task.Wait();
        }
        catch (Exception exception)
        {
            Console.WriteLine("Main: Catch " + exception.GetType().Name);
        }

        Console.WriteLine("Main: task.IsCanceled = {0}", task.IsCanceled);
        Console.WriteLine("Press any key to exit...");

        Console.ReadLine();
    }
}

输出是:

  • 任务:跑步
  • 主要:取消
  • 主要:等等
  • 任务:ThrowIfCancellationRequested
  • 任务:操作取消异常
  • 继续:cts.IsCancellationRequested = True,task.IsCanceled = False,task.Exception = AggregateException
  • 主要:task.IsCanceled = False
  • 按任何一个键退出...

如果我删除ContinueWith,则输出为:

  • 任务:跑步
  • 主要:取消
  • 主要:等等
  • 任务:ThrowIfCancellationRequested
  • 任务:操作取消异常
  • 主要:捕获聚合异常
  • 主要:task.IsCanceled = False
  • 按任何一个键退出...

我不明白,为什么 task.IsCanceled 在这两种情况下都返回 false?

为什么只在没有ContinueWith的情况下重新抛出异常?


我想要实现的是一种等待任务完成的统一且简单的方法,以及一个指示任务是否被取消的属性。


我认为你并没有取消任务本身,而只是抛出任务异常。尝试使用StartNew http://msdn.microsoft.com/en-us/library/dd988458.aspx(Action操作,CancellationToken取消令牌)而不是StartNew(Action操作)。您还可以将取消令牌作为参数添加到ContinueWith。

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

Task.IsCancelled 不起作用 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • C# 和月历,选择多个日期

    我正在制作一个程序 可以帮助人们用 C 为某个部门 预订 订单 他们需要能够选择不同月份的多个日期 我更愿意拥有它 这样他们就可以单击一个日期 然后按住 Shift 键单击另一个日期以选择这两个日期之间的所有日期 并控制单击以进行单选 取消
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 无法获取本地或参数的值,因为它在此指令指针处不可用,可能是因为它已被优化掉

    Visual Studio 2010 会删除 没有其他词 不安全块中函数参数之一中的数据 什么可能导致此错误 调试器显示以下消息 Cannot obtain value of local or argument as it is not a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • ViewModelTest 中线程“main @coroutine#2”java.lang.NullPointerException 中出现异常?

    我已经在 ViewModel 中使用带有 mockito 的协程编写了单元测试 类 但我遇到以下异常 Exception in thread main coroutine 2 java lang NullPointerException a
  • java中两个十六进制值相减或相加的方法

    有没有一种方法可以计算两个十六进制值而不将其转换为int 例如 String sHex f7c0 String bHex 040000000 十六进制值是整数 只是以十六进制而不是十进制表示 你就不能这样做吗 int sHex 0xf7c0
  • 如何在 HTML 文件中重复使用 Base64 图像

    我有一个可移植的 HTML 文件 可以分发给客户 它有一个文档索引 我想要每个文档都有一个 PDF 或 Word 图标 但如果可以避免的话 我不想重复 Base64 字符串 30 次 我该怎么做 Javascript 还可以 但我的目标是简
  • 如何将 timedelta 转换为小时

    我有一个 timedelta 数据框 JC time 1 3days 21 02 05 2 1days 23 50 07 3 6days 19 28 36 但我想要 1 93 02 05 2 47 50 07 3 163 28 36 我该如
  • 存储应用程序(库存应用程序)崩溃(在Android模拟器中)

    当我尝试打开Storage from 设置菜单在模拟器中 它 总是 崩溃并显示以下 logcat 输出 java lang NullPointerException at com android settings deviceinfo St
  • C++ 开源随机数生成算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要连续生成 1 10000 范围内的随机数 不能重复 有什么建议吗 描述 我们正在为我们的应用程序
  • iPhone - 在本地和生产环境设置之间切换

    我正在开发一个 iPhone 应用程序 它使用某处的服务器来获取其数据 在应用程序源代码的某个位置 我对用于连接的 URL 进行了硬编码 这很好 只是我并不总是想使用生产服务器进行测试 我不想弄乱实时数据 只是为了在本地测试一些东西 所以我
  • Modernizr 检查以检测 Firefox [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 使用 Modernizr 可以进行哪些检查来检测 Firefox 功能 即使不建议对功能进行浏览器检测 它也可以用于呈现其他类型的信息
  • 在selenium中使用隐式等待

    我是初学者 我理解等待的基本作用 但我对互联网上不同的教程如何放置和解释它感到困惑 例如 在下面的代码中 它被放置在加载 URL 之前 那么 是否只是等待 URL 加载或查找元素或两者兼而有之 如果我在 try 块中使用隐式等待一次 它是否
  • Console2中使用vim能识别吗?

    With Steven Harman 的 Solarized 调整 https github com stevenharman console2 solarized对于 Console2 我或多或少可以使用晒伤 http ethanscho
  • 使无序列表跨越 div 宽度的 100%

    div ul li First li li Second li li Third li li Fourth li ul div div width 100 li list style none float left 使用CSS 有没有办法让
  • 适用于 Databricks、Synapse 和 ADLS gen2 的数据治理解决方案

    我是数据治理的新手 如果问题缺少一些信息 请原谅我 客观的 我们正在 Azure 平台上为中型电信公司从头开始构建数据湖和企业数据仓库 我们使用 ADLS gen2 Databricks 和 Synapse 进行 ETL 处理 数据科学 M
  • 使用 d3.json() 获取数据不起作用,而使用 JS async wait 则可以。为什么? [复制]

    这个问题在这里已经有答案了 我正在尝试从 url 获取一些数据以在 d3 js 中使用 我无法使用来获取数据d3 json url callback 虽然我使用 ES8 时效果很好async await功能 有人可以帮助我理解为什么吗 我究
  • NSCell 与 NSView:当需要许多控件时

    我知道 Apple 不赞成使用NSCell赞成NSView 请参阅 AppKit 10 10 发行说明 此前曾建议NSCell当需要许多控制时出于性能原因使用 我花了相当多的时间来实现一个需要很多子视图的自定义控件 并且使用 NSView
  • 从 parquet 文件创建 SQL 表

    我正在使用 R 来处理大型数据集 最大数据帧 30 000 000 x 120 这些文件作为 parquet 文件存储在 Azure Datalake 存储中 我们需要每天查询这些文件并将其还原到本地 SQL 数据库中 无需将数据加载到内存
  • “DropDownList.SelectedIndex = -1”问题

    我只想要一个没有选定项目的 ASP NET DropDownList 到目前为止 将 SelectedIndex 设置为 1 没有任何作用 我正在使用 Framework 3 5 和 AJAX 即这个 DropDownList 位于 Upd
  • 通过 Kerberos 使用 Active Directory 进行身份验证

    我正在构建一个需要不同级别身份验证的 Android 应用程序 并且我想使用 Active Directory 来实现这一点 据我所知 使用 Kerberos 是 Microsoft 建议的方式 对于 Android 我该如何执行此操作 我
  • pip 显示错误“lsb_release -a”返回非零退出状态 1

    我正在尝试使用 pip 安装软件包 但它抛出错误 我用过的命令 sudo pip install selenium 它显示的错误 Exception Traceback most recent call last File usr loca
  • 删除或替换 javascript 中模式内的子字符串

    我需要 Javascript 中正则表达式的帮助 我正在寻找一种替换子字符串的方法 仅当它在引号内时 这是我的案例 源字符串 aa aa aa bbb bbb ccc sub string to remove 所需的字符串 aa aa aa
  • Task.IsCancelled 不起作用

    我有以下示例代码 static class Program static void Main var cts new CancellationTokenSource var task Task Factory StartNew gt try