取消的任务也显示为已完成

2024-01-22

我正在尝试使用异步等待和取消来对此事有更多的了解。为此,我制作了以下控制台应用程序:

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

namespace AsyncTest
{
    class Program
    {
        private static CancellationTokenSource _cancellationTokenSource;
        private static CancellationToken _cancellationToken;

        static void Main(string[] args)
        {
            Console.CancelKeyPress += myHandler;

            _cancellationTokenSource = new CancellationTokenSource();
            _cancellationToken = _cancellationTokenSource.Token;

            var task = DoWorkAsync(_cancellationToken).ContinueWith(ContinueMethod);
            task.Wait();

            Console.ReadLine();
        }

        protected static void myHandler(object sender, ConsoleCancelEventArgs args)
        {
            if (_cancellationToken.CanBeCanceled)
            {
                _cancellationTokenSource.Cancel();
            }
            args.Cancel = true;
        }

        static void ContinueMethod(Task task)
        {
            if (task.IsCanceled)
            {
                Console.WriteLine("The task was canceled");
            }

            if (task.IsCompleted)
            {
                Console.WriteLine("The task completed successfully");
            }

            if (task.IsFaulted)
            {
                if (task.Exception != null)
                {
                    var exceptions = task.Exception.Flatten().InnerExceptions;
                    foreach (var exception in exceptions)
                    {
                        Console.WriteLine(exception.Message);
                    }
                }
                Console.WriteLine("The task failed");
            }
        }

        static async Task DoWorkAsync(CancellationToken cancellationToken)
        {
            await Task.Run(() => DoWork(cancellationToken), cancellationToken);
        }

        static void DoWork(CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            Console.WriteLine("DoWork() is started");

            // Uncomment the following line of code to put the task in a 'faulted' state
            //throw new Exception();

            for (var count = 0; count < 10; count++)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    Console.WriteLine("Get a cancelation request");
                    cancellationToken.ThrowIfCancellationRequested();
                }
                else
                {
                    Thread.Sleep(500);
                    Console.WriteLine("Count : " + count);
                }
            }
            Console.WriteLine("DoWork() is finished");
        }
    }
}

当我让应用程序完成时,我正确地收到“任务成功完成”消息。

现在,当我按 CTRL+C 时,这会触发已启动任务的取消(请参阅拦截myHandler),我正确地收到“任务已取消”消息。但我也收到“任务成功完成”消息。我没想到任务也会显示为完成,因为我取消了它。 如果我取消注释throw new Exception();线在DoWork()方法,我正确地收到“任务失败”消息,但也收到“任务成功完成”消息。 我的假设是否错误?这是设计的吗?或者我完全错过了其他东西?

我当然可以通过添加额外的检查来解决这个问题,如下所示:

if (task.IsCompleted && !task.IsCanceled)
{
    Console.WriteLine("The task completed successfully");
}

但我不确定这是否是正确的方法,或者我的程序中是否有其他原因导致了这种完成状态。

预先感谢您对此事的意见和/或澄清。


的文档任务已完成 https://msdn.microsoft.com/de-de/library/system.threading.tasks.task.iscompleted(v=vs.110).aspx says

当任务处于以下三种最终状态之一时,IsCompleted 将返回 true:RanToCompletion、Faulted 或 Canceled。

So IsCompleted至少告诉您该任务不再运行。它不指示任务是否成功完成、失败或被取消。

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

取消的任务也显示为已完成 的相关文章

  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 用于 C# 的 TripleDES IV?

    所以当我说这样的话 TripleDES tripledes TripleDES Create Rfc2898DeriveBytes pdb new Rfc2898DeriveBytes password plain tripledes Ke
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 有可用的 WPF 备忘单吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 WPF 备忘单 其中包含用于绑定 资源和 WPF 中其他常见内容的 WPF 标记扩展 但到目前为止我还很难找到它 有人知道
  • Python 3:类型错误:下标泛型不能与类和实例检查一起使用

    如何测试 Python 2 和 Python 3 中的子类型 在 Python 2 7 18 中 gt gt gt import typing gt gt gt type typing List str gt gt gt issubclas
  • 实时数据绑定

    All 我目前有一个端到端工作的 POC WPF 项目 该应用程序模拟通过库 发布者 发布的实时市场数据 我的 WPF 客户端是订阅者 具有处理程序方法 它使用自定义事件来发布数据 我的问题是这样的 1 我想实现 Producer Cons
  • Spring Batch - 当 ItemReader 没有返回数据时如何使作业失败

    我有一个 Spring Batch 应用程序 它使用 JdbcCursorItemReader 从数据库表中读取数据 并使用 FlatFileItemWriter 将其写入平面文件 当我测试我的应用程序时 我发现即使没有通过 JdbcCur
  • 无法将类型“NSMutableArray”的值转换为预期参数类型“[SKAction]”

    我检查了我的旧游戏 用 SpriteKit 制作 我想在 Swift 2 0 中更新它 当我尝试修复它时 Xcode 发现了一个错误 错误是 无法将类型 NSMutableArray 的值转换为预期参数类型 SKAction 在代码中 to
  • 如何在 MongoKit 中关闭光标

    我正在使用 MongoKit 对大量数据执行迭代 在此过程中 我的光标变得无效 并且我得到 OperationFailure cursor id 369397057360964334 not valid at server 我在邮件列表中读
  • java.sql.sqlnontransientconnectionException:java.net.connectException:连接到端口上的服务器本地主机时出错

    我一直在使用 Derbyclient 本地托管的数据库 开发一个 java 项目 我已经完成了所有事情 除了当我尝试桌面应用程序而没有手动连接到数据库 来自 Netbeans 时 标题中的错误弹出 我似乎无法解决它 感谢您花时间阅读本文并为
  • 同时运行多个await

    我有一个看起来像这样的代码 firstList await GetFirstListFilesAsync textBlock1 Text found firstList Count first list s results secondLi
  • 通过 XML 使用 python suds 进行 WebService 请求

    我正在尝试使用 python 与网络服务器进行通信 我正在使用肥皂水库 事实上我对此很陌生 通常 要与此 Web 服务器通信 请发送一条 xml 消息 然后我会收到响应 这就是我想用 python 做的事情 这是我写的代码 from sud
  • Microsoft SQL Server 分页

    stackoverflow上有很多sql server分页问题 其中很多都谈到使用ROW NUMBER OVER ORDER BY AND CTE 一旦您进入数十万行并开始添加对非主键值的排序并添加自定义 WHERE 子句 这些方法就会变得
  • GWT 中大型数值数组的高效表示

    我有一个时间序列类 在一天内将保存 100K 200K 值 基本上是市场报价 统一采样 在java方面 性能最好的表示是使用double 而不是List 我怀疑这种方法是否能很好地映射到 javasctipt 中 在Java方面 doubl
  • jsp表达式标签<%和<%=的区别

    我或多或少知道 的表达式中引入一些逻辑来避免空值错误 除非我用 替换标签 否则我会收到错误 然而 在构建之后 我得到了 jsp 错误而不是 servlet 错误 我无法真正将原始代码粘贴到此处 但 内的代码本质上检索在 Struts 1 项
  • “编译时分配的内存”到底是什么意思?

    在 C 和 C 等编程语言中 人们经常提到静态和动态内存分配 我理解这个概念 但 所有内存在编译时都被分配 保留 这句话总是让我感到困惑 据我理解 编译是将高级 C C 代码转换为机器语言并输出可执行文件 编译文件中的内存是如何 分配 的
  • elasticsearch 按数组字段的大小进行过滤

    如何过滤包含数组字段且元素数量超过 N 的文档 如何过滤字段为空数组的文档 切面是解决方案吗 如果是这样 怎么办 我想看看脚本过滤器 http www elasticsearch org guide reference query dsl
  • Elasticsearch 集群“master_not_discovered_exception”

    我已经安装了elasticsearch 2 2 3并在2个节点的集群中进行了配置 节点 1 elasticsearch yml cluster name my cluster node name node1 bootstrap mlocka
  • 语音识别在 Unity Hololens 项目中不起作用

    我正在尝试在 Hololens 中创建自己的具有语音识别功能的 Unity 项目 我复制粘贴了来自的说明tutorial https developer microsoft com en us windows holographic hol
  • 查明某个类型是否实现了通用接口

    假设我有一个类型 MyType 我想做以下事情 查明对于某些 T MyType 是否实现了 IList 接口 如果 1 的答案是肯定的 请找出 T 是什么 似乎执行此操作的方法是 GetInterface 但它只能让您按特定名称进行搜索 有
  • Realm android 中的更新语句

    我应该如何在android中使用领域数据库更新已经存在的值 我一直在尝试更新它 但它只是作为新值添加而不覆盖它 更新现有对象及其领域数据库中所有字段的另一种方法是使用以下方法realm copyToRealmOrUpdate Object
  • PHP MYSQL 以阿拉伯语插入数据

    我正在尝试使用 PHP 和 HTML 表单将一些阿拉伯语言数据插入到 MySQL 中 当我将数据插入MYSQL表时 表字段将数据表示为 但是当我使用 PHP 访问相同的数据并将其显示在我的网页中时 它显示了正确的数据 我在用 http eq
  • 取消的任务也显示为已完成

    我正在尝试使用异步等待和取消来对此事有更多的了解 为此 我制作了以下控制台应用程序 using System using System Threading using System Threading Tasks namespace Asy