Реализация асинхронного тайм-аута с использованием асинхронных / ожидающих конструкций бедного человека в .Net 4.0

Motivation

C # 5.0 асинхронные / ожидающие конструкции - это круто, но, к сожалению, Microsoft показала только кандидат на выпуск .NET 4.5 и VS 2012, и потребуется некоторое время, чтобы эти технологии получили широкое распространение в наших проектах.

У Стивена ТаубаАсинхронные методы, итераторы C # и задачи Я нашел замену, которая может быть приятно использована в .NET 4.0. Есть также дюжина других реализаций, которые делают возможным использование этого подхода даже в .NET 2.0, хотя они кажутся немного устаревшими и менее функциональными.

Example

Итак, теперь мой код .NET 4.0 выглядит так (прокомментированные разделы показывают, как это делается в .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));
    }
}

Выглядит немного некрасиво, хотя это делает работу

The question

Когда используешьCancellationTokenSource в .NET 4.5 есть конструктор, который принимает временной интервал в качестве параметра времени ожидания, так что в результатеCancellationTokenSource отменяет в течение указанного периода времени.
.Net 4.0 не может тайм-аут, так как правильно сделать это в .Net 4.0?

Ответы на вопрос(3)

Ваш ответ на вопрос