C#ThreadPool一个线程阻塞其他?

时间:2011-06-10 17:00:16

标签: c# threadpool block

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

问题在于,所有线程在短时间内只执行其操作,但只有一个线程继续显示其输出,其余线程正在等待该线程。

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

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);
    }

2 个答案:

答案 0 :(得分:4)

首先,您应该将responseresStream包裹在using块中,以确保它们被妥善处理。

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

答案 1 :(得分:0)

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

  

mySqlManager.SaveResult(tempString);

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

祝你好运!