我写了一个多线程的测试程序,测试结果完全正确,但是移植到项目代码里面后就出了问题,ThreadPool.SetMaxThreads(33, 33)(数字随便写的),加了设置后,我的主线程就直接没有了,不能继续执行了,web页面就一直卡着,但是当我停止程序运行后,页面才跳过去;如果不加ThreadPool.SetMaxThreads(33, 33)设置的话,就可以正常运行,还有一个情况:我获取每个线程,有主线程和所有子线程的System.Threading.Thread.CurrentThread.GetHashCode(),发现其中一个子线程的值和主线程相等,请问下,这个是怎么回事,或者是什么导致的,代码如下:
 static List<WaitHandle> waitHandles = new List<WaitHandle>();
        public void SupportSync(List<SyncClass> syncClassList)
        {
//加了这个后页面就不能跳转了,但是日志打出的返回值是true,不加的话,页面可以跳转,但是我看日志里面好像没有并
//发,子线程是一个个执行的           // bool flag=ThreadPool.SetMaxThreads(33, 33);
           // LoggerHelper.log.Info("flag:" + flag);
            for (int i = 0; i < syncClassList.Count; i++)
            {
                LoggerHelper.log.Info("开始排队!");
                ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), syncClassList[i]);
                waitHandles.Add(syncClassList[i].waitHandle);
            }            LoggerHelper.log.Info("开始接收所有信号量");
            WaitHandle.WaitAll(waitHandles.ToArray());
            LoggerHelper.log.Info("结束接收所有信号量");            foreach (var waitHandle in waitHandles)
            {
                waitHandle.Dispose();
                LoggerHelper.log.Info("释放waitHandle");
            }
        }        public static void DoWork(object syncClass)
        {
            LoggerHelper.log.Info("进入 DoWork 方法");
            SyncClass send = (SyncClass)syncClass;
            LoggerHelper.log.Info("contest="+send.context);
            AutoResetEvent are = (AutoResetEvent)send.waitHandle;
            send.sendInfo.DoSend(send);(正是调用另外一个接口的实现方法)
            LoggerHelper.log.Info(Thread.CurrentThread.GetHashCode() + "发送信号量");
//这里获取的哈希码其中有一个和主线程的哈希码一样,这个现象正常吗?
            are.Set();
        }核心代码在这里,请各位高手指点,或者有需要补充的说明,我在线请教!

解决方案 »

  1.   

    具体自己看看
    不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目。如果公共语言运行库是被承载的,例如被 IIS 或 SQL Server 承载,主机可能会限制或禁止更改线程池大小。更改线程池中的最大线程数时需谨慎。虽然这类更改可能对您的代码有益,但对您使用的代码库可能会有不利的影响。将线程池大小设置得太大可能导致性能问题。如果同时执行的线程太多,任务切换开销就成为影响性能的一个主要因素。
      

  2.   


    这些我看过,虽然不懂是什么意思,但是我想应该没有违背其中的什么条例,因为我写了一个测试程序,结果完全OK,对了我想问下  不能将辅助线程的数目或 I/O 完成线程的数目 这2个东西到底是什么意思,能用通俗点的话说不?
      

  3.   

    和主线程哈希一样,看帮助不能保证哈希代码是唯一的。如果需要为托管线程使用唯一标识符,请使用 ManagedThreadId 属性
      

  4.   


    ManagedThreadId 也是一样的,并且和哈希值相等,我获取过这个值,其实我这边的流程是这样的,因为在么个时刻,有很多人需要点击这个功能,所以我新开了一个线程做了一个限制人数的操作,用Mutex限制的,然后再这个新开线程里面建立了一个线程池,也就是上述代码了,那个调用的方法就是实现功能的,本意是点击了该功能按钮后,页面就能直接跳转,但是现在加了数量限制,页面就无法跳转了,不加数量限制,页面是可以跳转的,结果也正确
      

  5.   


    ManagedThreadId 这个值也相等,并且和哈希值都相等;我这个流程是这样的,先新开一个线程用Mutex做了一个限制人数的功能,因为在某个时刻,点击该功能的人太多了,然后再这个线程中使用线程池,因为该功能需要把信息发送到多个终端,要并发,本意是点击该功能之后,页面实现跳转,直接等页面自动刷新看结果就行,但是加了ThreadPool.SetMaxThreads之后,页面就不能跳转了,但是日志里面显示,操作都完成了,不加的话,页面也可以跳转,并且操作日志也一样,加过是完成的;加不加这个设置,也有子线程和主线程的哈希一样,偶尔也不一样。你看这个能不能找出点什么问题