Task.IsCancelled不起作用 - c#

我有以下示例代码:

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
任务:OperationCanceledException
ContinueWith:cts.IsCancellationRequested = True,task.IsCanceled = False,task.Exception = AggregateException
主:task.IsCanceled = False
按任何一个键退出...

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

任务:跑步
主要:取消
主:等待
任务:ThrowIfCancellationRequested
任务:OperationCanceledException
主要:Catch AggregateException
主:task.IsCanceled = False
按任何一个键退出...

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

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

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

参考方案

我认为您不是要取消任务本身,而是要从任务中引发异常。尝试使用StartNew(动作操作,CancellationToken cancelledToken)代替StartNew(动作操作)。您也可以将取消令牌作为参数添加到ContinueWith。

在Spring中实例化一个新线程以定期执行任务 - java

我有一个用Spring制作的仪表板,它必须控制某些任务的执行。基本思想是有一个线程将该任务定期发送到远程跟踪器。如何实例化该线程?我已经阅读了一些,有人说使用线程不是一个好主意。这会导致Spring生命周期出现问题吗?还有另一种方法可以使方法定期调用吗? 参考方案 Spring支持任务计划。在此处查找更多信息:http://static.springsour…

将python数据传递到web2py中的javascript - javascript

这是我的问题。我有以下功能def index(): rows=db(db.mylist).select() return dict(rows=rows) 因此,每当我重新加载前视图索引时,我都想从数据库中检索行并将数据显示在列表中给用户{{for(r in rows)}} li.innerhtml={{=rows.task}} {{pass}} 显然,这不是…

如何监视和重新启动在C#中引发异常的任务? - c#

假设我有一个实例化无限期运行的三个任务的程序。这些任务旨在并行运行。但是,可以说这些任务由于网络错误有时会引发异常。监视任务并在必要时重新启动它最简单的技术是什么?解决此问题的我的工作是监视Task.Status数据,并在任务出现故障时简单地调用Task.Start()方法。但是,此代码不起作用,因为任务异常会导致整个应用程序崩溃。using System;…

从具有返回类型Task的方法返回值 - c#

我可能在这里错过了一些东西。语法不正确。static Task<int> MathOperation(int number) { //return new Task(new Func(TestMethod(number))); } static int LongRunningMethod(int number) { // some long ru…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…