Реализация асинхронного тайм-аута с использованием асинхронных / ожидающих конструкций бедного человека в .Net 4.0
C # 5.0 асинхронные / ожидающие конструкции - это круто, но, к сожалению, Microsoft показала только кандидат на выпуск .NET 4.5 и VS 2012, и потребуется некоторое время, чтобы эти технологии получили широкое распространение в наших проектах.
У Стивена ТаубаАсинхронные методы, итераторы C # и задачи Я нашел замену, которая может быть приятно использована в .NET 4.0. Есть также дюжина других реализаций, которые делают возможным использование этого подхода даже в .NET 2.0, хотя они кажутся немного устаревшими и менее функциональными.
ExampleИтак, теперь мой код .NET 4.0 выглядит так (прокомментированные разделы показывают, как это делается в .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));
}
}
Выглядит немного некрасиво, хотя это делает работу
The questionКогда используешьCancellationTokenSource в .NET 4.5 есть конструктор, который принимает временной интервал в качестве параметра времени ожидания, так что в результатеCancellationTokenSource
отменяет в течение указанного периода времени.
.Net 4.0 не может тайм-аут, так как правильно сделать это в .Net 4.0?