Конструкции async/await C #5.0 великолепны, но, к сожалению, пока Microsoft показала только кандидата на выпуск как.NET 4.5, так и VS 2012, и потребуется некоторое время, чтобы эти технологии получили широкое распространение в наших проектах.
В книгах Стивена Тауба Асинхронные методы, итераторы C #и задачи я нашел замену, которую можно с успехом использовать в.NET 4.0. Существует также дюжина других реализаций, позволяющих использовать этот подход даже в.NET 2.0, хотя они кажутся немного устаревшими и -менее богатыми возможностями.
Итак, теперь мой код.NET 4.0 выглядит так (в комментариях показано, как это делается в.NET 4.5):
//private async Task ProcessMessageAsync()
private IEnumerable ProcessMessageAsync()
{
//var udpReceiveResult = await udpClient.ReceiveAsync();
var task = Task
.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));
}
}
Выглядит немного некрасиво, хотя работает
При использовании CancellationTokenSource в.NET 4.5 существует конструктор, который принимает временной интервал в качестве параметра тайм-аута, поэтому результирующий CancellationTokenSource
отменяется в течение указанного периода времени.
.Net 4.0 не имеет тайм-аута, так как же правильно это сделать в.Net 4.0?