C# 任务。延迟不返回主线程
我正在测试async/await,问题就在这里。我正在异步启动两个任务,并等待它们的执行完成。我希望这两个任务分别等待延迟,然后返回打印总已用毫秒数。但是程序只打印C# 任务。延迟不返回主线程,c#,multithreading,async-await,C#,Multithreading,Async Await,我正在测试async/await,问题就在这里。我正在异步启动两个任务,并等待它们的执行完成。我希望这两个任务分别等待延迟,然后返回打印总已用毫秒数。但是程序只打印1开始“+当前时间和2开始“+当前时间,但之后不打印。如何从延迟的任务返回并打印最终结果 static void Main(string[] args) { RunTasksWithDelays(); } static async void RunTasksWithDelays()
1开始“+当前时间
和2开始“+当前时间
,但之后不打印。如何从延迟的任务返回并打印最终结果
static void Main(string[] args)
{
RunTasksWithDelays();
}
static async void RunTasksWithDelays()
{
Stopwatch s = Stopwatch.StartNew();
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Task task1 = LongRunningTask1();
Task task2 = LongRunningTask2();
await Task.WhenAll(task1, task2);
Console.WriteLine("total milliseconds elapsed: " + s.ElapsedMilliseconds / 1000);
}
static async Task LongRunningTask1()
{
Console.WriteLine("1 start " + DateTime.Now);
await Task.Delay(5000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("1 end " + DateTime.Now);
}
static async Task LongRunningTask2()
{
Console.WriteLine("2 start " + DateTime.Now);
await Task.Delay(2000);
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("2 end " + DateTime.Now);
}
您的方法
RunTasksWithDelays
应该返回一个任务,以便调用者等待该任务完成
然后您只需调用
RunTasksWithDelays().Wait()
您的方法RunTasksWithDelays
应该返回一个任务,以便调用者等待此任务完成
然后您只需调用
RunTasksWithDelays().Wait()代码>主线程结束,程序也随之结束,因为应用程序中没有前台线程来保持程序的活动状态
理想情况下,您应该等待RunTasksWithDelays
方法,但由于两个原因,您不能等待它
您的方法不会返回Task
Main
方法不支持wait
您应该使RunTasksWithDelays方法返回async Task
而不是async void
,并且应该等待其完成。同步等待是一个坏主意,在这种情况下这没关系,因为我们没有任何选择
static void Main(string[] args)
{
RunTasksWithDelays().Wait();
}
static async Task RunTasksWithDelays()
{
...
}
主线程结束,程序也随之结束,因为应用程序中没有前台线程来保持程序的活动状态
理想情况下,您应该等待RunTasksWithDelays
方法,但由于两个原因,您不能等待它
您的方法不会返回Task
Main
方法不支持wait
您应该使RunTasksWithDelays方法返回async Task
而不是async void
,并且应该等待其完成。同步等待是一个坏主意,在这种情况下这没关系,因为我们没有任何选择
static void Main(string[] args)
{
RunTasksWithDelays().Wait();
}
static async Task RunTasksWithDelays()
{
...
}
RunTasksWithDelays
是一个无效方法。捕捉得好,我看到了async关键字和我的大脑插入任务。RunTasksWithDelays
是一个无效方法。捕捉得好,我看到了async关键字和我的大脑插入任务。这很有效。我知道我需要等待,但不知道如何在Main中完成。有没有办法知道在整个执行过程中产生了多少线程?@Sam不,没有。操作可能在没有任何单个线程或N个线程的情况下完成。没有办法找到答案(阿飞)。这是有效的。我知道我需要等待,但不知道如何在Main中完成。有没有办法知道在整个执行过程中产生了多少线程?@Sam不,没有。操作可能在没有任何单个线程或N个线程的情况下完成。没有办法找到答案。