Implementieren eines Async-Timeouts mit Async / Warten-Konstrukten für nicht funktionierende Benutzer in .Net 4.0
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.
BeispielJetzt 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 FrageBeim 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?