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?