Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 在IIS中创建四个以上实例时进程被卡住_C# 4.0_Process_Connection_Iis 7.5 - Fatal编程技术网

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个以上的线程,那么这些进程就会卡在那里

测试完成:

  • 当我们在同一台服务器上使用VisualStudio运行完全相同的代码时,没有发生错误。所有线程都已正确生成,并且所有进程都在正确运行。这很奇怪。
  • 当两个用户单击按钮并同时单击时,将产生4个线程,前四个线程将正常工作,而后四个线程将卡在那里。
  • 当我们使用不执行任何连接的不同可执行文件运行线程时,代码会正常工作
  • 在我们的代码中,使用任务或线程并没有什么区别 我们怀疑这可能与IIS中允许到特定IP的出站连接有关

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

    几点想法:

  • 这是否可以绑定到线程池线程?CLR通过在线程池线程上分配(最初无论如何)的线程数不超过现有处理器的数量来防止CPU不必要的旋转。是否有4个虚拟处理器?不过,线程池线程最终应该恢复,所以请确保您的线程确实被卡住了,而不是运行串行线程
  • 我知道在C#中重定向标准输出时出现死锁情况。仔细检查这篇文章,以确保这不会发生在你身上
  • 其他想法:
    此时,听起来您的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,并且会自动退出)。