Implementando o tempo limite assíncrono usando construções pobres do tipo async / await no .Net 4.0

Motivação

As construções async / await do C # 5.0 são impressionantes, infelizmente a Microsoft apenas mostrou um candidato a lançamento do .NET 4.5 e do VS 2012, e levará algum tempo até que essas tecnologias sejam amplamente adotadas em nossos projetos.

Em Stephen Toub'sMétodos assíncronos, iteradores C # e tarefas Eu encontrei um substituto que pode ser bem usado no .NET 4.0. Há também uma dúzia de outras implementações que tornam possível usar a abordagem mesmo no .NET 2.0, embora pareçam pouco desatualizadas e menos ricas em recursos.

Exemplo

Então agora meu código .NET 4.0 parece (as seções comentadas mostram como isso é feito no .NET 4.5):

//private async Task ProcessMessageAsync()
private IEnumerable<Task> ProcessMessageAsync()
{
    //var udpReceiveResult = await udpClient.ReceiveAsync();

    var task = Task<UdpAsyncReceiveResult>
               .Factory
               .FromAsync(udpClient.BeginReceive, udpClient.EndReceive, null);

    yield return task;

    var udpReceiveResult = task.Result;

    //... blah blah blah

    if (message is BootstrapRequest)
    {
        var typedMessage = ((BootstrapRequest)(message));

        // !!! .NET 4.0 has no overload for CancellationTokenSource that 
        // !!! takes timeout parameter :(
        var cts 
          = new CancellationTokenSource(BootstrapResponseTimeout); // Error here

        //... blah blah blah

        // Say(messageIPEndPoint, responseMessage, cts.Token);

        Task.Factory.Iterate(Say(messageIPEndPoint, responseMessage, cts.Token));
    }
}

Parece um pouco feio, embora faça o trabalho

A questão

Ao usarCancellationTokenSource no .net 4.5 existe um construtor que leva tempo como um parâmetro de tempo limite, de modo que o resultadoCancellationTokenSource cancela dentro do período de tempo especificado.
.Net 4.0 não é capaz de tempo limite, então qual é a maneira correta de fazer isso no .net 4.0?

questionAnswers(3)

yourAnswerToTheQuestion