日期:2014-05-17  浏览次数:20811 次

C# 线程池问题
我写了一个多线程的测试程序,测试结果完全正确,但是移植到项目代码里面后就出了问题,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();
  }

核心代码在这里,请各位高手指点,或者有需要补充的说明,我在线请教!

------解决方案--------------------
具体自己看看
不能将辅助线程的数目或 I/O 完成线程的数目设置为小于计算机的处理器数目。

如果公共语言运行库是被承载的,例如被 IIS 或 SQL Server 承载,主机可能会限制或禁止更改线程池大小。

更改线程池中的最大线程数时需谨慎。虽然这类更改可能对您的代码有益,但对您使用的代码库可能会有不利的影响。

将线程池大小设置得太大可能导致性能问题。如果同时执行的线程太多,任务切换开销就成为影响性能的一个主要因素。


------解决方案--------------------
和主线程哈希一样,看帮助

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