【发布时间】:2013-11-19 22:03:48
【问题描述】:
理想情况下,我想做的是以非阻塞模式延迟任务,然后等待所有任务完成。我尝试添加 Task.Delay 返回的任务对象,然后使用 Task.WaitAll 但这似乎无济于事。我该如何解决这个问题?
class Program
{
public static async void Foo(int num)
{
Console.WriteLine("Thread {0} - Start {1}", Thread.CurrentThread.ManagedThreadId, num);
var newTask = Task.Delay(1000);
TaskList.Add(newTask);
await newTask;
Console.WriteLine("Thread {0} - End {1}", Thread.CurrentThread.ManagedThreadId, num);
}
public static List<Task> TaskList = new List<Task>();
public static void Main(string[] args)
{
for (int i = 0; i < 3; i++)
{
int idx = i;
TaskList.Add(Task.Factory.StartNew(() => Foo(idx)));
}
Task.WaitAll(TaskList.ToArray());
}
}
【问题讨论】:
-
为什么要在控制台应用程序中这样做?没有上下文(默认情况下),所以
await无论如何都会表现得很奇怪...... -
您希望在控制台中看到什么?这与您所看到的有何不同?
-
@AndrewShepherd:我希望看到六行显示每个任务的开始和结束。但现在我只看到 Start...
-
您的代码似乎对我有用......(在 wpf 解决方案中运行,但是,一旦结束在 GUI 线程上运行,代码仍然有效......)
-
async void传递给Task.Factory.StartNew的方法是个坏主意。您无法跟踪它启动的待处理任务或捕获它在await之后可能引发的任何异常。查看更多信息:stackoverflow.com/q/19747910/1768303
标签: c# multithreading async-await