动机
C# 5.0 async/await 构造非常棒,但不幸的是,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));
}
}
虽然它能完成工作,但看起来有点难看
问题
使用时取消令牌源在.NET 4.5中,有一个构造函数将时间跨度作为超时参数,因此结果CancellationTokenSource
在指定时间内取消。
.Net 4.0 无法超时,那么在 .Net 4.0 中执行此操作的正确方法是什么?
FWIW,您可以在4.0项目中使用async/await,只需使用异步定位包。非常适合我!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)