motivazione
C# 5.0 asincrona/attendono costrutti sono impressionanti, purtroppo ancora Microsoft visualizzati solo una release candidate di entrambi .NET 4.5 e VS 2012, e ci vorrà un po 'di tempo prima che queste tecnologie vengano ampiamente adottate nei nostri progetti.Implementazione timeout asincrono utilizzando poveri asincrona mans/attendono costrutti in .Net 4.0
In Stephen Toub Asynchronous methods, C# iterators, and Tasks ho trovato un sostituto che può essere ben utilizzato in. NET 4.0. Ci sono anche una dozzina di altre implementazioni che rendono possibile utilizzando l'approccio anche in .NET 2.0 se sembrano po 'obsolete e meno ricco di funzionalità.
Esempio
Così ora il mio codice .NET 4.0 si presenta come (sezioni commentate mostrano come si è fatto 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));
}
}
Sembra po 'brutto se si fa il lavoro
La domanda
Quando si utilizza CancellationTokenSource NET 4.5 c'è un costruttore che prende periodo come parametro timeout, cosicché risulta CancellationTokenSource
annulla entro un periodo di tempo specificato.
.Net 4.0 non è in grado di timeout, quindi qual è il modo corretto di farlo in .Net 4.0?
questione connessa: http://stackoverflow.com/questions/9110472/using-async-await-on- net-4 – CodesInChaos
Changed "timer" a "timeout" nel titolo in quanto la questione è di circa timeout e "timer" (utilizzato per la ricorrente con alcune esecuzioni d'epoca) è stato fuorviante e disorientante –