在IIS中创建四个以上实例时,进程卡住



Background:
我有一个c#。净(。Net 4.0)网站,调用一个引擎,通过供应商的可执行文件,我不能修改从外部数据库抓取数据。每当用户点击一个特定的按钮时,网页将指示引擎生成几个线程,每个线程将生成一个可执行进程(我们称之为ABC.exe)来获取数据。然后将运行可执行文件,并将抓取的数据保存到服务器上的CSV文件中。然后,线程首先读取CSV并合并所有数据,进行一些计算,然后返回到网站。

问题:
当我们将网站部署到web服务器上的IIS 7.5时(运行windows 7,四个虚拟处理器),如果我们产生超过4个线程,进程就会卡在那里。

测试完成:

  1. 当我们在同一台服务器上使用Visual Studio运行相同的代码时,没有发生错误。所有线程都正确生成,所有进程都正确运行。这很奇怪。
  2. 当两个用户点击按钮,都点击将产生4个线程,前四个线程将正常工作,而第二个四个线程将卡住在那里。
  3. 当我们用不同的可执行文件运行线程时,不执行任何连接,代码工作。
  4. 在我们的代码中,使用任务或线程没有区别。

我们怀疑这可能与IIS中允许到特定IP的出站连接有关。

有人能解释一下吗?如果需要进一步的资料,请告诉我。谢谢!

几点思考:

  1. 这可以绑定到线程池线程吗?CLR试图防止CPU不必要的旋转,方法是在线程池线程上分配的线程(最初是这样)不要超过当前的处理器数量。是否存在4个虚拟处理器?但是,线程池线程最终应该恢复,因此请确保您的线程确实卡住了,而不是运行串行。
  2. 我知道c#中重定向标准输出时会出现死锁。仔细检查MSDN文章,以确保这种情况没有发生在你身上。

额外的想法:
在这一点上,听起来你的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());
        }
    }
}

最新更新