2011-06-10 83 views
2

我有一个C#控制台应用程序,我有一个线程池。在线程池中将会有一个类执行一个连续的方法(直到它运行了一段时间或知道何时停止)。该方法连接到一个HttpWebResponse流,并继续保留它。C#ThreadPool一个线程阻塞其他?

问题是,在很短的时间内,所有的线程只是做他们的事情,但只有一个线程继续显示它的输出,其余的正在等待该线程。

这是为每个线程执行的方法。

function void ReadStream() 
     byte[] buf = new byte[8192]; 

     String domain = streamingUrl 

     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(domain); 
     HttpWebResponse response = (HttpWebResponse) 
     request.GetResponse(); 

     Stream resStream = response.GetResponseStream(); 

     string tempString = null; 
     int count; 
     do 
     { 
      // fill the buffer with data 
      count = resStream.Read(buf, 0, buf.Length); 

      if (count != 0) 
      { 
       tempString = Encoding.ASCII.GetString(buf, 0, count); 

       try 
       { 
        mySqlManager.SaveResult(tempString); 

        Console.WriteLine("Been here"); 
        Thread.Sleep(1000); 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 
     while (count > 0); 
    } 
+0

当应用程序处于其他线程在一个线程中等待的状态时,您可以在调试器中击中全部。这可能会向您显示这些线程正在等待的内容。同时检查空的catch块中的任何异常,这可能会隐藏一些有趣的内容。 – 2011-06-10 17:03:56

+0

不应该使用new关键字创建streamReader的新实例吗? – 2011-06-10 17:04:27

回答

4

首先,你应该在using块包裹都responseresStream,以确保他们妥善处理。

其次,在我看来,长期运行的线程ThreadPool中并不是最好的主意。 ThreadPool类的想法是,它允许你排队相对较小的动作,为每个动作产生一个新的线程将是浪费。如果您的操作需要大量时间来运行,我会建议实际为每个对象创建专用的Thread对象。

+0

我怀疑线程池中的Thread.Sleep(1000)导致了这个问题。我也面临同样的问题。问题是为什么线程池线程阻塞其他线程? – Vivasaayi 2013-07-11 14:36:06

0

你应该在调试器真正打破找出每个线程停止在,但我的猜测是,罪魁祸首是

mySqlManager.SaveResult(tempString);

mySqlManager似乎是一个类属性,这意味着您需要特别小心线程安全性。确保SaveResult()是线程安全的;如果没有,那么你需要使用锁定对SaveResult()进行线程安全调用。

祝你好运!