线程池的请求方式
最近把项目升级实现异步编程,没一个成熟的项目,都要演变好几个版本才能趋于稳定。在 Web 服务器上,.NET Framework 维护一个用于服务 ASP.NET 请求的线程池。 当请求到达时,将调度池中的线程以处理该请求。 如果对请求进行同步处理,则在处理请求时将阻塞处理请求的线程,并且该线程不能对另一个请求提供服务。这可能不是一个问题,因为线程池可以设置得足够大以容纳许多阻塞的线程。 但是,线程池中的线程数目是有限制的。 在同时处理多个长时间运行的请求的大型应用程序中,可能会阻塞所有可用的线程。 这种情况称为“线程不足”。 当出现这种情况时,Web 服务器会将请求排队。 如果请求队列已满,则 Web 服务器会拒绝请求并处于 HTTP 503 状态(服务器太忙)。
处理异步请求
在可能出现线程不足的应用程序中,您可以配置通过异步方式处理操作。 异步请求与同步请求所需的处理时间相同。例如,如果某个请求生成一个需要两秒钟来完成的网络调用,则该请求无论是同步执行还是异步执行都需要两秒钟。但是,在异步调用的过程中,服务器在等待第一个请求完成的过程中不会阻塞对其他请求的响应。 因此,当有许多请求调用长时间运行的操作时,异步请求可以防止出现请求排队的情况
在asp.net mvc 中使用异步
namespace AsyncProgram.Service { /// <summary> /// 业务处理aaa /// </summary> public class EventRepository { private int _nextId = 1; List<Event> events=new List<Event>(); public EventRepository() { AddEvent(new Event() { Title = "辽宁女厅官退休前敛财 28个月日均受贿近万", UserName = "ant", }); } public Event AddEvent(Event model) { if (model!=null) { model.Id = _nextId++; model.Time = DateTime.Now; events.Add(model); } return model; } /// <summary> /// 获取所有数据 /// </summary> /// <returns></returns> public List<Event> GetAll() { return events; } } }
api 代码
public class EventController : ApiController { // // GET: /Api/Event/ private static readonly EventRepository DataEventRepository = new EventRepository(); /// <summary> /// 获取所有数据 /// </summary> /// <returns></returns> public HttpResponseMessage Get() { List<Event> dataList = DataEventRepository.GetAll(); OData<Event> data=new OData<Event>(dataList,dataList.Count); return Request.CreateResponse(HttpStatusCode.OK, data); } /// <summary> /// 通过client客户端获取所有数据 /// </summary> /// <param name="type"></param> /// <returns></returns> public IEnumerable<Event> GetByClient(string type) { return DataEventRepository.GetAll(); } }
controller 代码
public class HomeController : Controller { private HttpClient client = new HttpClient(); private string url = "http://localhost:8409/api/Event/GetByClient?type=client"; private JsonMediaTypeFormatter formatter = System.Web.Http.GlobalConfiguration.Configuration.Formatters.Where( f => { return f.SupportedMediaTypes.Any( v => v.MediaType.Equals("application/json", StringComparison.CurrentCultureIgnoreCase)); }).FirstOrDefault() as JsonMediaTypeFormatter; /// <summary> /// Client客户端,使用httpclient实现异步通讯 /// </summary> /// <returns></returns> public async Task<ActionResult> Index() { var data = await client.GetAsync(url); var dt = data.Content.ReadAsAsync<IEnumerable<Event>>(); ViewBag.data = dt; return View(); } }
view 赋值
@{ ViewBag.Title = "Index"; Task<IEnumerable<Event>> data = ViewBag.data; } <h2>Index</h2> <div class="container"> <table class="table table-bordered table-striped"> <thead> Client客户端,使用httpclient实现异步通讯 </thead> @{ var p = 12; var dt = data.Result.ToList(); for (int i = 0; i < dt.Count; i++) { <tr> <td>@dt[i].Id</td> <td>@dt[i].Title</td> <td>@dt[i].UserName</td> <td>@dt[i].Time</td> </tr> } } </table> <div></div> </div>
相关推荐
本教程是继使用HttpClient调用Web API只有的补充教程,主要讲解了如何在WPF中异步调用Web API且不阻塞主线程。
研究Webservice异步调用的实现, 1、通过异步调用的方式实现高性能的使用WebService的API
WebApiClientCore 的netcore版本,集高级高可扩展性于一体的声明式http客户端库,特别适用于微服务的restful资源请求,也适用于各种畸形的http接口请求。努吉特包名描述努吉特WebApiClientCore基础包 ...
3.11.4 如何使用Servlet 3异步化 59 3.11.5 一些Servlet 3异步化压测数据 64 4 限流详解 66 4.1 限流算法 67 4.1.1 令牌桶算法 67 4.1.2 漏桶算法 68 4.2 应用级限流 69 4.2.1 限流总并发/连接/请求数 69 4.2.2 限流...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
5.2.3 异步广播 5.3 系统广播应用 5.3.1 系统广播 5.3.2 开机启动程序 5.3.3 电量监测 5.4 本章小结 第6章 Service(服务) 6.1 生命周期 6.2 Binder机制 6.3 AIDL基础 6.3.1 定义AIDL接口 6.3.2 使用AIDL开发程序的...