当前位置: 首页 > 编程语言 > C#

使用Task.WaitAll()处理等待任务?分享

时间:2023-04-10 16:47:43 C#

使用Task.WaitAll()处理等待任务?理想情况下,我想做的是使用非阻塞模式延迟任务,然后等待所有任务完成。我试图添加由Task.Delay返回的任务对象,然后使用Task.WaitAll但似乎这不起作用。我该如何解决这个问题?varnewTask=Task.Delay(1000);TaskList.Add(newTask);等待新任务;Console.WriteLine("线程{0}-结束{1}",Thread.CurrentThread.ManagedThreadId,num);}publicstaticListTaskList=newList();publicstaticvoidMain(string[]args){for(inti=0;iFoo(idx)));}Task.WaitAll(TaskList.ToArray());}}这是你想要实现的目标吗?使用System.Collections.Generic;使用系统线程;使用System.Threading.Tasks;namespaceConsoleApplication{classProgram{publicstaticasyncTaskFoo(intnum){Console.WriteLine("线程{0}-开始{1}",Thread.CurrentThread.ManagedThreadId,num);等待任务。延迟(1000);Console.WriteLine("线程{0}-结束{1}",Thread.CurrentThread.ManagedThreadId,num);}publicstaticListTaskList=newList();publicstaticvoidMain(string[]args){for(inti=0;iOutput:Thread10-Start0Thread10-Start1Thread10-Start2Thread6-End0Thread6-End2Thread6-End1PressEntertoexit...注意,因为Foo是异步的,所以它本身就是一个任务。你的例子有一些任务只是启动Foo任务,但不要等待它。换句话说,Task.WaitAll(TaskList.ToArray())只是等待每个Task.Delay启动,但它不会等待所有这些任务完成。这可能是您想要实现的目标:classProgram{publicstaticasyncTaskFoo(intnum){Console.WriteLine("Thread{0}-开始{1}",Thread.CurrentThread.ManagedThreadId,num);varnewTask=Task.Delay(1000);awaitnewTask;Console.WriteLine("线程{0}-结束{1}",Thread.CurrentThread.ManagedThreadId,num);}publicstaticListTaskList=newList();publicstaticvoidMain(string[]args){for(inti=0;iFoo(idx));TaskList.Add(fooWrappedInTask);}Task.WaitAll(TaskList.ToArray());Console.WriteLine("完成等待所有任务:-Thread{0}",Thread.CurrentThread.ManagedThreadId);我已经测试过了,它会产生你想要的控制台输出。这里的主要区别是我们调用Task.Run而不是Task.Factory.StartNew。您可能有一个返回任务的任务,它甚至可能返回另一个任务。您会认为这是一个任务“链”。Task.Run返回一个Task代表链中的最后一个任务。当你等待它时,你就是在等待任务链中的每个环节完成。相反,Task.Factory.StartNew返回代表链中第一个链接的任务。等待之后,您让链条的其余部分等待。在任务不返回另一个任务的绝大多数情况下,这很好。以上就是C#学习教程:UseTask.WaitAll()tohandlewaitingtasks?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: