【发布时间】:2019-06-05 20:10:55
【问题描述】:
问题出在输出上
当前输出为
工作等待
工作开始
延迟开始
工作完成
延迟结束
我想去哪里
工作等待
工作开始
延迟开始
延迟结束
工作完成
private static Task _task;
public static void Main(string[] args)
{
Call().Wait();
}
private static async Task Call()
{
_task = new Task(async () => { await Pause(); });
var timer = new Timer();
timer.Interval = 10000;
timer.Enabled = true;
timer.AutoReset = false;
timer.Elapsed += Timer_Elapsed;
Console.WriteLine("job waiting");
await _task;
Console.WriteLine("job done");
Console.ReadKey();
}
public static async Task Pause()
{
Console.WriteLine("Delay started");
await Task.Delay(10000);
Console.WriteLine("Delay ended");
}
private static void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
Console.WriteLine("job starting");
_task.Start();
}
【问题讨论】:
-
Task构造函数并不意味着传递异步任务,你甚至不需要。_task = new Task(() => Pause()); -
任务不是线程。很少有任何理由使用
Task构造函数。 所有示例、教程、课程、文章显示使用Task.Run(或 2012 年之前的Task.Factory.StartNew)开始新任务。 -
如果你想等待
Pause,你可以在Call()中写await Pause()。Task.Delay()不会阻塞,所以没有理由在另一个线程中启动它。使用await Task.Run(()=>Pause())意味着Console.WriteLine语句将在后台线程中运行,Task.Delay的工作方式与之前相同 -
嗨,我很欣赏上面的所有答案,但我这样做的原因是因为我需要在某个时间点创建一个任务,但稍后再启动它,所以你看我有必要这样做通过构造函数创建任务\
-
任务通常在“热”状态下创建,这意味着它们已经启动。据我所知,冷任务不适用于
await。是否可以不创建冷任务,而是创建委托,然后将此委托用作热任务的操作?
标签: c# .net task-parallel-library