Motivation
C# 5.0 async/await Konstrukte sind genial, leider aber nur Microsoft Release Candidate von sowohl .NET 4.5 und VS 2012, und gezeigt, Es wird einige Zeit dauern, bis sich diese Technologien in unseren Projekten durchsetzen werden.Asynchron-Timeout-Implementierung armen mans Asynchron mit/erwarten Konstrukte in .Net 4.0
In Stephen Toub Asynchronous methods, C# iterators, and Tasks Ich habe einen Ersatz gefunden, der in .NET 4.0 verwendet werden kann. Es gibt auch ein Dutzend anderer Implementierungen, die es möglich machen, den Ansatz auch in .NET 2.0 zu verwenden, obwohl sie wenig veraltet und weniger funktionsreich erscheinen.
Beispiel
So jetzt meine .NET 4.0 Code wie folgt aussieht (die kommentierten Abschnitte zeigen, wie es in .NET 4.5 ausgeführt 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 wenig hässlich, obwohl es die Arbeit erledigt
Die Frage
Wenn ein Konstruktor, die Zeitspanne als Timeout-Parameter nimmt, so dassresultierende Verwendung CancellationTokenSource in .NET 4,5 ist,storniert innerhalb eines bestimmten Zeitraums.
. Net 4.0 ist nicht in der Lage zu Timeout, also was ist der richtige Weg, das in .NET 4.0 zu tun?
Verwandte Frage: http://stackoverflow.com/questions/9110472/using-async-await-on- net-4 – CodesInChaos
Geändert "Timer" auf "Timeout" im Titel, da die Frage über Timeout und "Timer" (für wiederkehrende mit einigen Perioden Ausführungen) war irreführend und desorientierend –