【发布时间】:2016-09-01 10:53:27
【问题描述】:
我在为它注册一个延续之后尝试开始一个任务。但是在调用await Task.Delay() 后立即触发。
using System;
using System.Linq;
using System.Threading.Tasks;
namespace ConsoleApplication30
{
class Program
{
static void Main(string[] args)
{
var task = new Task(async delegate {
Console.WriteLine("Before delay");
await Task.Delay(1000);
Console.WriteLine("After delay");
});
task.ContinueWith(t => {
Console.WriteLine("ContinueWith");
});
task.Start();
Console.ReadLine();
}
}
}
输出:
Before delay
ContinueWith
After delay
这里有什么问题?
【问题讨论】:
-
new Task(->new Task<Task>(,task.ContinueWith->task.Unwrap().ContinueWith -
几乎没有理由使用
new Task (,除非您正在编写任务调度程序。请改用Task.Run ( -
我正在尝试创建一个在完成时将自身从任务列表中删除的任务。为了安全地做到这一点,我需要确保在启动之前将其添加到列表中。我正在尝试执行以下操作:创建一个任务,将其添加到列表中,注册删除它的延续,启动任务。有没有更好的办法?
-
这不是你有问题的部分。问题是继续连接到错误的任务,因为您不了解
async的工作原理。您的任务在到达第一个await后立即完成,因为内部任务(等待Task.Delay的任务)和外部任务(您使用new Task显式创建的)之间没有任何联系。正如 Scott 所说,不要使用任务构造函数。该代码可以与Task.Run一起正常工作(而且您也不应该真正使用它 - 只需运行代码,无需将其发布到另一个线程即可立即返回)。
标签: c# async-await .net-4.5