Implementando o tempo limite assíncrono usando construções pobres do tipo async / await no .Net 4.0
As construções async / await do C # 5.0 são impressionantes, infelizmente a Microsoft apenas mostrou um candidato a lançamento do .NET 4.5 e do VS 2012, e levará algum tempo até que essas tecnologias sejam amplamente adotadas em nossos projetos.
Em Stephen Toub'sMétodos assíncronos, iteradores C # e tarefas Eu encontrei um substituto que pode ser bem usado no .NET 4.0. Há também uma dúzia de outras implementações que tornam possível usar a abordagem mesmo no .NET 2.0, embora pareçam pouco desatualizadas e menos ricas em recursos.
ExemploEntão agora meu código .NET 4.0 parece (as seções comentadas mostram como isso é feito no .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 um pouco feio, embora faça o trabalho
A questãoAo usarCancellationTokenSource no .net 4.5 existe um construtor que leva tempo como um parâmetro de tempo limite, de modo que o resultadoCancellationTokenSource
cancela dentro do período de tempo especificado.
.Net 4.0 não é capaz de tempo limite, então qual é a maneira correta de fazer isso no .net 4.0?