Motivation
==========

C# 5.0 async/await constructs are awesome, unfortunately yet Microsoft only shown a release candidate of both .NET 4.5 and VS 2012, and it will take some time until these technologies will get widely adopted in our projects.

In Stephen Toub's [Asynchronous methods, C# iterators, and Tasks](http://blogs.msdn.com/b/pfxteam/archive/2009/06/30/9809774.aspx) I've found a replacement that can be nicely used in .NET 4.0. There are also a dozen of other implementations that make it possible using the approach even in .NET 2.0 though they seem little outdated and less feature-rich.

Example
=======

So now my .NET 4.0 code looks like (the commented sections show how it is done in .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));
    }
}

```

Looks little ugly though it does the job

The question
============

When using [CancellationTokenSource](http://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource.aspx) in .NET 4.5 there is a constructor that takes timespan as a timeout parameter, so that resulting `CancellationTokenSource` cancels within specified period of time.  

.Net 4.0 is not able to timeout, so what is the correct way of doing that in .Net 4.0?