干货:本人不会长篇大论。能贴上去的,就是干货,能用一两句话讲明白的,不会大讲概念,不会浪费大家宝贵的时间。
前言:我们发现,超时是个非常重要的概念,如果在通讯架构中,没有超时的设计,那么这个通讯架构就是废品。我们可以很清楚的发现,HTTP 请求,SOCKET 请求,底层都离不开响应超时。如果没有设置超时/或者超时时间设置过大,那么 调用层与被调用层 将产生严重的雪崩效应。接下来,我们来讲讲超时是如何实现的。
直接贴上 干货代码--这是我 Bitter NetCore Netty 通讯框架中的一段代码:
private Task<RMessage> RegisterResultCallbackAsync(string id, int timeOut) { var tcs = new TaskCompletionSource<RMessage>(); _resultDictionary.TryAdd(id, tcs); var task = tcs.Task; var taskTimeOut = Task.Delay(timeOut); Task.Factory.StartNew(() => { if (Task.WhenAny(task, taskTimeOut).Result == taskTimeOut) { //处理超时业务逻辑 TimeOutCallBack(id); } }); //设置超时 return task; }
经典超时代码原理:代上述代码其实很简单,就是利用两个线程,一个业务线程,定义一个延迟 timeout执行的线程,将两个线程同时放入Task.WhenAny 方法中,Task.WhenAny : 等待只要方法中的其中一个线程执行完毕,就返回 当前执行完毕的线程对象。
上述代码很简单,贴上去的就是核心代码-干货。希望对正在 怎么写超时的同学有用,我会不定期的上干!谢谢大家支持,请留个关注!