C# 4.0 在IIS中创建四个以上实例时进程被卡住
背景:C# 4.0 在IIS中创建四个以上实例时进程被卡住,c#-4.0,process,connection,iis-7.5,C# 4.0,Process,Connection,Iis 7.5,背景: 我有一个C#.Net(.Net 4.0)网站,它调用引擎,通过我无法修改的供应商可执行文件从外部数据库获取数据。每当用户单击特定按钮时,网页将指示引擎生成几个线程,每个线程将生成一个可执行进程(我们称之为ABC.exe)来获取数据。然后,可执行文件将运行,并将抓取的数据保存到服务器上的CSV文件中。然后线程首先读取CSV并合并所有数据,进行一些计算并返回到网站 问题: 当我们将网站部署到web服务器(运行Windows7,四个虚拟处理器)上的IIS7.5时,如果我们生成了4个以上的线程,
我有一个C#.Net(.Net 4.0)网站,它调用引擎,通过我无法修改的供应商可执行文件从外部数据库获取数据。每当用户单击特定按钮时,网页将指示引擎生成几个线程,每个线程将生成一个可执行进程(我们称之为ABC.exe)来获取数据。然后,可执行文件将运行,并将抓取的数据保存到服务器上的CSV文件中。然后线程首先读取CSV并合并所有数据,进行一些计算并返回到网站 问题:
当我们将网站部署到web服务器(运行Windows7,四个虚拟处理器)上的IIS7.5时,如果我们生成了4个以上的线程,那么这些进程就会卡在那里 测试完成:
此时,听起来您的ABC.exe是可疑的。由于服务器上有Visual Studio,我建议您启动一个单独的Visual Studio实例,并附加到其中一个ABC.exe进程以查看它挂起的位置。另外,尝试运行您合理确定会退出的程序,例如
cmd/c dir
,而不是ABC.exe
编辑:5/29:我发现很难相信IIS会以这种方式限制出站连接。请尝试以下简单的下载操作,而不是ABC.exe:
class Program
{
public static void Main(string[] args)
{
using (var reader = new System.IO.StreamReader(
System.Net.HttpWebRequest.Create("http://www.google.com")
.GetResponse().GetResponseStream()))
{
System.Console.WriteLine(reader.ReadToEnd());
}
}
}
1) 是的,有4个虚拟处理器。当我运行超过4个线程(比如说5个线程)时,我可以在我的任务管理器中看到5个ABC.exe实例,每个实例的内存消耗大约为8K。除非我暂停并要求线程终止进程,否则所有实例都不会自行退出。但是当我使用4个线程运行时,所有4个ABC.exe实例都正常运行(内存消耗为30k-60k,并且会自动退出)。