Implementieren eines Async-Timeouts mit Async / Warten-Konstrukten für nicht funktionierende Benutzer in .Net 4.0

Motivation

Async / await-Konstrukte in C # 5.0 sind fantastisch, leider hat Microsoft nur einen Release-Kandidaten für .NET 4.5 und VS 2012 gezeigt, und es wird einige Zeit dauern, bis sich diese Technologien in unseren Projekten durchsetzen.

In Stephen ToubsAsynchrone Methoden, C # -Iteratoren und Tasks Ich habe einen Ersatz gefunden, der in .NET 4.0 verwendet werden kann. Es gibt auch ein Dutzend anderer Implementierungen, die es ermöglichen, den Ansatz auch in .NET 2.0 zu verwenden, obwohl sie wenig veraltet und weniger funktionsreich erscheinen.

Beispiel

Jetzt sieht mein .NET 4.0-Code so aus (die kommentierten Abschnitte zeigen, wie es in .NET 4.5 gemacht wird):

//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));
    }
}

Sieht ein wenig hässlich aus, obwohl es den Job macht

Die Frage

Beim BenutzenCancellationTokenSource In .NET 4.5 gibt es einen Konstruktor, der die Zeitspanne als Timeout-Parameter verwendet, so dass sich ergibtCancellationTokenSource storniert innerhalb der angegebenen Frist.
.Net 4.0 kann keine Zeitüberschreitung verursachen. Wie wird dies in .Net 4.0 korrekt durchgeführt?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage