Como serializar assíncrono / aguardar?

Vamos supor que eu tenho esse trecho simples:

async void button_Click(object sender, RoutedEventArgs e)
{
    await Task.Factory.StartNew(() =>
    {
        Console.WriteLine("start");
        Thread.Sleep(5000);
        Console.WriteLine("end");
    });
}

Obviamente, toda vez que eu pressiono esse botão, uma nova tarefa é iniciada, mesmo quando uma tarefa anterior ainda é executada. Como adiaria qualquer nova tarefa até que todas as tarefas anteriores terminassem?

Mais alguns detalhes:

No exemplo acima, cada nova tarefa é idêntica à tarefa anterior. No entanto, no contexto original, a sequência de tarefas é importante: os parâmetros podem mudar (eu poderia "simular" isso usandoDateTime.Now.Ticks) As tarefas devem ser executadas na ordem em que são "registradas". Especificamente, meu programa conversará com um dispositivo serial. Eu fiz isso antes com um thread em segundo plano utilizando umBlockingCollection. No entanto, desta vez, há um protocolo estrito de solicitação / resposta e eu gostaria de usar o assíncrono / aguardar, se possível.

Solução possível:

Eu poderia imaginar criar tarefas e armazená-las em uma lista. Mas como eu executaria as tarefas com relação aos requisitos? Ou devo retornar à solução baseada em encadeamento que usei antes?

questionAnswers(4)

yourAnswerToTheQuestion