动机
C# 5.0 async/await 结构很棒,不幸的是,Microsoft 只展示了 .NET 4.5 和 VS 2012 的候选版本,这些技术在我们的项目中得到广泛采用还需要一些时间。
在 Stephen Toub 的 Asynchronous methods, C# iterators, and Tasks我找到了一个可以在 .NET 4.0 中很好地使用的替代品。还有许多其他实现使得即使在 .NET 2.0 中也可以使用该方法,尽管它们看起来有点过时且功能不那么丰富。
例子
现在我的 .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));
}
}
看起来有点丑,但它能完成工作
问题
使用 CancellationTokenSource 时在 .NET 4.5 中有一个构造函数将时间跨度作为超时参数,因此生成的 CancellationTokenSource
在指定的时间段内取消。
.Net 4.0 无法超时,那么在 .Net 4.0 中正确的做法是什么?
最佳答案
FWIW,您可以在 4.0 项目中使用 async/await,只需使用 the async targeting pack .对我来说很棒!
关于c# - 在 .Net 4.0 中使用 poor mans async/await 构造实现异步超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11300900/