Motywacja
C# 5.0 asynchroniczny/czekają konstrukty są niesamowite, niestety jeszcze Microsoft pokazano tylko kandydata uwalniania zarówno .NET 4.5 i VS 2012, i to zajmie trochę czasu, zanim technologie te zostaną szeroko przyjęte w naszych projektach.Wdrażanie limit czasu transmisji asynchronicznej z wykorzystaniem słabe mans asynchronicznie/czekają konstrukty w .NET 4.0
W Stephen Toub's Asynchronous methods, C# iterators, and Tasks Znalazłem zamiennik, który może być ładnie używany w .NET 4.0. Istnieje również kilkanaście innych implementacji, które umożliwiają korzystanie z tego podejścia nawet w .NET 2.0, chociaż wydają się one nieco przestarzałe i mniej bogate w funkcje.
Przykład
Więc teraz mój kod .NET 4.0 wygląda (komentowanym sekcje pokazać jak to się robi w .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));
}
}
Wygląda trochę brzydki choć spełnia swoje zadanie
Pytanie
Podczas korzystania z CancellationTokenSource w .NET 4.5 istnieje konstruktor, który przyjmuje czas jako parametr limitu czasu, dzięki czemu wyniknie CancellationTokenSource
anuluje w określonym czasie.
.Net 4.0 nie może przekroczyć limitu czasu, więc jaki jest prawidłowy sposób to zrobić w .Net 4.0?
pokrewne pytanie: http://stackoverflow.com/questions/9110472/using-async-await-on- net-4 – CodesInChaos
Zmieniono "timer" na "timeout" w tytule, ponieważ pytanie dotyczy limitu czasu i "timera" (używanego do powtarzania z niektórymi okresowymi egzekucjami) było mylące i dezorientujące. –