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

Мотивация

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

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

Пример

Итак, теперь мой код.NET 4.0 выглядит так (в комментариях показано, как это делается в.NET 4.5):

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

    var task = Task
              .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));
    }
}

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

Вопрос

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

6
задан Gennady Vanin Геннадий Ванин 6 May 2013 в 12:41
поделиться