句柄如何与线程相关?

时间:2009-12-02 20:31:33

标签: c# windows

句柄与线程的关系究竟如何?我正在编写一个接受HTTP请求的服务,并在返回响应之前调用方法。我编写了一个测试客户端,发送10,000个HTTP请求(使用信号量确保一次只发出1000个请求)。

如果我通过ThreadPool调用方法(在返回响应之前处理的方法),或者通过通用的Action <T>。BeginInvoke,服务的句柄将继续存在并保持不变直到所有请求都完成,但服务的线程数几乎停滞不前。

但是,如果我在返回响应之前同步调用该方法,则线程数会增加,但句柄计数将经历极端峰值和谷值。

这是Windows机器上的C#(Server 2008)

2 个答案:

答案 0 :(得分:1)

您的描述太模糊,无法提供良好的诊断。但ThreadPool旨在精心限制活动线程的数量。它将避免运行比CPU内核更多的线程。只有当一个线程被“卡住”时,它才会安排一个额外的线程。这就解释了为什么你看到线程数量没有大幅增加。并且,间接地,为什么句柄计数保持稳定,因为机器的工作量较少。

答案 1 :(得分:0)

您可以将句柄视为指针的抽象。 Windows中有许多使用句柄的东西(当您在API级别打开文件时,您可以获得文件句柄,创建窗口时,窗口有句柄,线程有句柄等)。因此,您的句柄计数可能与您的线程上发生的操作有关。如果你有更多的线程在运行,同时会有更多的东西,所以你会看到更多的句柄打开。