Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已取消的任务也显示为已完成_C#_Task Parallel Library_Cancellation - Fatal编程技术网

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

C# 已取消的任务也显示为已完成,c#,task-parallel-library,cancellation,C#,Task Parallel Library,Cancellation,我正在使用async Wait和cancellation来进一步了解这个问题。为此,我制作了以下控制台应用程序: using System; using System.Threading; using System.Threading.Tasks; namespace AsyncTest { class Program { private static CancellationTokenSource _cancellationTokenSource;

我正在使用async Wait和cancellation来进一步了解这个问题。为此,我制作了以下控制台应用程序:

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");
        }
    }
}
但我不确定这是否是正确的方法,或者我的程序中是否有其他原因导致了这种完成状态

提前感谢您对此事的投入和/或澄清。

的文档

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


因此,
IsCompleted
至少告诉您任务不再运行。它不表示任务是否成功完成、失败或取消。

谢谢!我真的应该开始阅读更多的文档,而不是自己做假设。这是正确的。您想检查TaskStatus属性以验证取消和完成,因为被取消的任务是有效的完成条件。@KevinD yes或开始询问更多关于此的问题。但是这个问题可以通过阅读文档很容易地解决。@KevinD:我对
状态和相关属性(例如,
IsCompleted
)有一个直观的描述。
if (task.IsCompleted && !task.IsCanceled)
{
    Console.WriteLine("The task completed successfully");
}