当前位置: 首页 > 编程语言 > C#

在.Net 4.0中使用差的mans async - await构造实现异步超时分享

时间:2023-04-10 11:30:37 C#

C#学习教程:在.Net4.0中使用Poormansasync/await构造实现异步超时展示了.NET4.5和VS2012的候选版本,这些技术在我们的项目中被广泛采用还需要一些时间。在StephenToub的异步方法、C#迭代器和任务中,我找到了一种适用于.NET4.0的替代方案。还有许多其他实现甚至在.NET2.0中使用该方法,尽管它们看起来不那么过时且功能不那么丰富。示例所以现在我的.NET4.0代码看起来像(注释部分显示了它在.NET4.5中是如何完成的):接收异步();vartask=Task.Factory.FromAsync(udpClient.BeginReceive,udpClient.EndReceive,null);yield返回任务;varudpReceiveResult=task.Result;//...blahblahblahif(messageisBootstrapRequest){vartypedMessage=((BootstrapRequest)(message));//!!!.NET4.0没有CancellationTokenSource的重载//!!!接受超时参数:(varcts=newCancellationTokenSource(BootstrapResponseTimeout);//这里出错//...blahblahblah//Say(messageIPEndPoint,responseMessage,cts.Token);Task.Factory.Iterate(Say(messageIPEndPoint,responseMessage,cts.Token));}}看起来有点难看,虽然它确实解决了这个问题的技巧Item在.NET4.5中使用CancellationTokenSource时,有一个构造函数将时间跨度作为超时参数来取消生成的CancellationTokenSource在指定的时间段内。.Net4.0不能超时,那么在.Net4.0中正确的做法是什么?这真的与异步/等待有关吗?似乎您只需要一种独立于async/await的取消令牌的方法,对吧?在这种情况下,您是否可以简单地创建一个在超时后调用cancel的Timer?新定时器(状态=>cts.Cancel(),null,BootstrapResponseTimeout,Timeout.Infinite);编辑我上面的初步回答是基本的想法,但更好的解决方案可能是在IsCancellationTokenSource.CancelAfter()错误中你找到了吗?(实际上是您正在寻找的构造函数的.Net4.5实现)。这是一个可用于从该代码创建超时令牌的函数。publicstaticCancellationTokenSourceCreateTimeoutToken(intdueTime){if(dueTime{((Timer)self).Dispose();try{source.Cancel();}catch(ObjectDisposedException){}});timer.Change(到期时间,-1);返回源;FWIW,您可以在4.0项目中使用async/await,只需使用asynclocate包即可。为我工作!您仍然可以使用CancelAfter(),它是Microsoft.Bcl.Async的扩展方法,与上面接受的答案非常相似。当我按F12查看CancelAfter()的实现时,这是参考源码:以上是C#学习教程:使用.Net4.0中的穷人async/await结构实现异步超时。很有用,需要多了解C#学习教程,希望大家多多关注——///指定时长后取消。///CancellationTokenSource。///源被取消的到期时间(以毫秒为单位)。publicstaticvoidCancelAfter(thisCancellationTokenSourcesource,intdueTime){if(source==null)thrownewNullReferenceException();如果(dueTime{timer.Dispose();TimerManager.Remove(timer);try{source.Cancel();}catch(ObjectDisposedExceptionex){}}),(object)null,-1,-1);TimerManager.Add(计时器);timer.Change(到期时间,-1);}本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处: