<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      抓蟲系列(四) 不要輕視web程序中常用的三個"池" 之線程池

      2011-10-22 14:12  熬夜的蟲子  閱讀(918)  評論(2)    收藏  舉報

      前篇回顧:上篇講了數據庫連接池的問題,其實關于是否是活動連接還是有很大問題可以挖掘的。這個有空蟲子再和大家交流了

      本篇談下線程池的相關問題,希望各位看官留個爪印,應用程序池和數據庫連接池可能大部分程序員不需要關心那個,不過線程池可所謂是重頭戲了。

      先把蟲子的觀點放上: 個人表示排斥在項目中使用ThreadPool這個類,至于.net中關聯到ThreadPool的資源我們暫且不做討論。如果需要操作線程池可以使用第三方例如SmartThreadPool或者自己按照自己的項目需求開發一個。

      線程池的相關概念我就不多說了,同樣這里我只介紹下。線程池中容易被忽視的問題。

      一. 相對池外線程,池內線程操作的性能極差!

       

       ManualResetEvent[] MR = new ManualResetEvent[10];
                  for (int i = 0; i < 10; i++)
                  {
                      MR[i] = new ManualResetEvent(false);
                  }
                  int a, b;
                  ThreadPool.GetMaxThreads(out a, out b);
                  Console.WriteLine(string.Format("(輔助線程的最大數目{0}  I/O線程的最大數目{1})    初始狀態", a, b));
                  ThreadPool.GetAvailableThreads(out a, out b);
                  Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}  可用I/O線程的最大數目{1})    初始狀態", a, b));
              
                  Stopwatch sw = Stopwatch.StartNew();
                  for (int i = 0; i < 10; i++)
                  {
                    
                      new Thread((qq) =>
                      {
                          Console.WriteLine("這是個線程池外的線程"+qq.ToString());
                          MR[(int)qq].Set();
                          Thread.Sleep(5000);
      
                      }) { }.Start(i);
                  }
                  WaitHandle.WaitAll(MR);
                  Console.WriteLine("生成池外10個線程 共耗時" + sw.ElapsedMilliseconds);
      
                  foreach (ManualResetEvent me in MR)
                  {
                      me.Reset();
                  }
                  Thread.Sleep(500);
                  ThreadPool.GetAvailableThreads(out a, out b);
                  Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}  可用I/O線程的最大數目{1})    線程池外啟動線程后", a, b));
      
                  sw = Stopwatch.StartNew();
                  for (int i = 0; i < 10; i++)
                  {
                  ThreadPool.QueueUserWorkItem(qq =>
                      {                  
                          Console.WriteLine("這是個線程池內的線程" + qq.ToString());
                          MR[(int)qq].Set();
                          Thread.Sleep(20000);
                          
                      },i);
                  }
                  WaitHandle.WaitAll(MR);
                  Console.WriteLine("生成池內10個線程 共耗時" + sw.ElapsedMilliseconds);
      
                  Thread.Sleep(6000);
                  ThreadPool.GetAvailableThreads(out a, out b);
                  Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}  可用I/O線程的最大數目{1})    線程池內啟動線程后", a, b));
      

      在初始狀態后 生成線程的效率存在百倍的差距!!!不過線程池既然是池的作用那么在程序運行中應該會好很多。

      二。線程池內的線程只能是后臺線程。

      三。不能為線程設置優先級。在高精度的項目中線程池不適用。

      四。所支持的Callback不能有返回值。WaitCallback只能帶一個object類型的參數,沒有任何返回值。

      五。容易被干擾,同時容易破壞項目的應用環境。舉些例子

      static void Main(string[] args)
              {                    
                  //哪些函數會影響線程池
                  int a, b;
                  Timer timer = new Timer((qq) =>
                  {            
                      Console.WriteLine("這是一個timer");
                      Thread.Sleep(2000);
      
                  }, null, 2000, 1000);
                 
                  ThreadPool.GetAvailableThreads(out a, out b);
                  Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}  可用I/O線程的最大數目{1})    Timer啟動后", a, b));
                  timer.Dispose();
      
                  timer = new Timer((qq) =>
                  {          
                      ThreadPool.GetAvailableThreads(out a, out b);
                      Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}/可用I/O線程的最大數目{1}) Timer資源占用ing", a, b));
                  }, null, 2000, 1000);
      
                  var act = new Action(testmethod);
                  var qqt = act.BeginInvoke(CallbackMethod, act);
             
      
                  Console.ReadLine();
              }
      
              static void CallbackMethod(IAsyncResult ar)
              {
                  var caller = (Action)ar.AsyncState;
                  caller.EndInvoke(ar);
                  Console.WriteLine("Action回調結束");
       
              }
      
              static void testmethod()
              {
                  Console.WriteLine("Action開始");
                  int a, b;
                  ThreadPool.GetAvailableThreads(out a, out b);
                  Console.WriteLine(string.Format("(可用輔助線程的最大數目{0}  可用I/O線程的最大數目{1})    Action啟動ing", a, b));
                  Thread.Sleep(2000);
              
              }
      

      至于還有哪些,大家可以各自討論,或者提出反對的意見。



      主站蜘蛛池模板: 亚洲精品成人福利网站| 亚洲春色在线视频| 婷婷四虎东京热无码群交双飞视频| 亚洲成av人在线播放无码| 亚洲AV无码久久久久网站蜜桃| 午夜福利国产精品视频| 色噜噜亚洲精品中文字幕| 国产粉嫩系列一区二区三| 上栗县| 亚洲国产精品一区第二页| 中文字幕有码日韩精品| 亚洲精品一区二区妖精| 色哟哟www网站入口成人学校| 亚洲国产v高清在线观看| 悠悠人体艺术视频在线播放| 国产乱人伦av在线无码| 久久欧洲精品成av人片| 鹤岗市| 久久精品国产99久久久古代| 国产精品福利自产拍在线观看 | 亚洲精品一区二区妖精| 熟妇人妻中文a∨无码| 国产午夜福利精品久久不卡| 四虎在线永久免费看精品| 国产色无码精品视频免费| 99久久精品费精品国产一区二区 | 在线a亚洲老鸭窝天堂| 九九热视频精品在线播放| 国产小受被做到哭咬床单GV| 亚洲欧美日产综合在线网| 国产69精品久久久久人妻| 2020精品自拍视频曝光| 欧美成人www免费全部网站| 欧美最猛性xxxxx大叫| 2019亚洲午夜无码天堂| 色色97| 国产精品老熟女露脸视频| 亚洲五月丁香综合视频| 2022最新国产在线不卡a| 国产伦精品一区二区三区| bt天堂新版中文在线|