当前位置:首页 > Web开发 > 正文

out t3); ThreadPool.GetMaxThreads(out t2

2024-03-31 Web开发

在前文中,介绍了.NET下的多种异步的形式,在WEB措施中,天生就是多线程的,因此使用异步应该更为谨慎。本文将着重展开ASP.NET中的异步。

【注意】本文中提到的异步指的是处事器端异步,而非客户端异步(Ajax)。

对付HTTP的请求响应模型,处事器无法主动通知或回调客户端,当客户端倡议一个请求后,必需连结连接期待处事器的返回功效,才华继续措置惩罚惩罚,因此,对付客户端来说,请求与响应是无法异步进行,也就是说无论处事器如何措置惩罚惩罚请求,对付客户端来说没有任何分歧。

技术图片

那么ASP.NET异步指的又是什么,解决了什么问题呢?

在解释ASP.NET异步前,先来考察下ASP.NET线程模型。

ASP.NET线程模型

我们知道,一个WEB处事可以同时处事器多个用户,我们可以想象一下,WEB措施应该运行于多线程环境中,对付运行WEB措施的线程,我们可以称之为WEB线程,那么,先来看看WEB线程长什么样子吧。

我们可以用一个HttpHandler输出一些内容。

public class Handler : IHttpHandler
{

public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
var thread = Thread.CurrentThread;
context.Response.Write(
string.Format("Name:{0}\r\nManagedThreadId:{1}\r\nIsBackground:{2}\r\nIsThreadPoolThread:{3}",
thread.Name,
thread.ManagedThreadId,
thread.IsBackground,
thread.IsThreadPoolThread)
);
}

public bool IsReusable
{
get {return true;}
}
}

你可以看到类似于这样的功效:

Name:

ManagedThreadId:57

IsBackground:True

IsThreadPoolThread:True

这里可以看到,WEB线程是一个没有名称的线程池中的线程,如果刷新这个页面,还有机会看到 ManagedThreadId 在不停变革,并且可能反复呈现。说明WEB措施有机会运行于线程池中的差别线程。

为了模拟多用户并发访谒的情况,我们需要对这个措置惩罚惩罚措施添加酬报的延时,并输出线程相关信息与开始结束时间,再通过客户端措施同时倡议多个请求,检察返回的内容,分析请求的措置惩罚惩罚情况。

public void ProcessRequest(HttpContext context)
{
DateTime begin = DateTime.Now;
int t1, t2, t3;
ThreadPool.GetAvailableThreads(out t1, out t3);
ThreadPool.GetMaxThreads(out t2, out t3);
Thread.Sleep(TimeSpan.FromSeconds(10));
DateTime end = DateTime.Now;
context.Response.ContentType = "text/plain";
var thread = Thread.CurrentThread;
context.Response.Write(
string.Format("TId:{0}\tApp:{1}\tBegin:{2:mm:ss,ffff}\tEnd:{3:mm:ss,ffff}\tTPool:{4}",
thread.ManagedThreadId,
context.ApplicationInstance.GetHashCode(),
begin,
end,
t2 - t1
)
);
}

我们用一个命令行措施来倡议请求,并显示功效。

static void Main()
{
var url = new Uri("http://localhost:8012/Handler.ashx");
var num = 50;
for (int i = 0; i < num; i++)
{
var request = WebRequest.Create(url);
request.GetResponseAsync().ContinueWith(t =>
{
var stream = t.Result.GetResponseStream();
using (TextReader tr = new StreamReader(stream))
{
Console.WriteLine(tr.ReadToEnd());
}
});
}
Console.ReadLine();
}

这里,我们同时倡议了50个请求,然后不雅察看响应的情况。

【注意】后面的功效会因为操纵系统、IIS版本、管道模式、.NET版本、配置项 的差别而差别,以下功效为在Windows Server 2008 R2 + IIS7.5 + .NET 4.5 beta(.NET 4 runtime) + 默认配置 中测试的功效,在没有出格说明的情况下,均为重启IIS后第一次运行的情况。
    这个措施在我的电脑运行功效是这样的: 

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32070.html