我有以下示例代码:
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答复。这是我实施的一部分[email protected]("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…