motivación
C# 5.0 asíncrono/aguardan construcciones son impresionantes, sin embargo, por desgracia Microsoft sólo muestran una versión candidata de ambos .NET 4.5 y VS 2012, y se tomará algún tiempo hasta que estas tecnologías sean ampliamente adoptadas en nuestros proyectos.La implementación de tiempo de espera asincrónico utilizando pobres asíncrono Mans/esperan construcciones en .Net 4.0
En Stephen Toub's Asynchronous methods, C# iterators, and Tasks He encontrado un reemplazo que se puede utilizar muy bien en .NET 4.0. También hay una docena de otras implementaciones que hacen posible el uso del enfoque incluso en .NET 2.0, aunque parecen poco anticuadas y menos ricas en funciones.
Ejemplo
Así que ahora mi código .NET 4.0 se parece a (las secciones comentadas muestran cómo se hace en .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));
}
}
Parece poco fea pesar de que hace el trabajo
La pregunta
Al utilizar CancellationTokenSource en .NET 4.5 hay un constructor que toma intervalo de tiempo como un parámetro de tiempo de espera, de modo que resultante CancellationTokenSource
cancela dentro de un período de tiempo especificado.
.Net 4.0 no puede esperar, ¿cuál es la forma correcta de hacerlo en .Net 4.0?
pregunta relacionada: http://stackoverflow.com/questions/9110472/using-async-await-on- net-4 – CodesInChaos
Cambió "temporizador" a "tiempo de espera" en el título ya que la pregunta es sobre tiempo de espera y "temporizador" (usado para recurrir con algunas ejecuciones de período) fue engañoso y desorientador –