Encadeamento de Tarefas (aguarde a conclusão da tarefa anterior)

var tasks = new List<Task>();

foreach (var guid in guids)
{
    var task = new Task( ...);
    tasks.Add(task);
}

foreach (var task in tasks)
{
    task.Start();
    Task.WaitAll(task);
}

Isso é executado do thread da interface do usuário. Eu preciso executar todas as tarefas na variável de tarefas, uma após a outra. O problema é se eu chamo Task.WaitAll (tarefa), o congelamento da interface do usuário. Como posso fazer a seguinte lógica sem ter o congelamento da interface do usuário?

questionAnswers(3)

yourAnswerToTheQuestion