C # ThreadPool один поток блокирует другой? - PullRequest
2 голосов
/ 10 июня 2011

У меня есть консольное приложение 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 ]

4 голосов
/ 10 июня 2011

Во-первых, вы должны обернуть оба блока response и resStream в using, чтобы обеспечить их правильную утилизацию.

Во-вторых, помещать длинных потоков в ThreadPool, на мой взгляд, не самая лучшая идея. Идея класса ThreadPool заключается в том, что он позволяет ставить в очередь относительно небольшие действия, в которых создание нового потока для каждого было бы расточительным. Если у вас есть операции, для выполнения которых требуется значительное количество времени, я бы посоветовал на самом деле создать выделенные Thread объекты для каждого.

0 голосов
/ 10 июня 2011

Вы должны действительно сломаться в отладчике, чтобы узнать, где остановлен каждый поток, но я предполагаю, что виновником является

mySqlManager.SaveResult (tempString);

mySqlManager представляется свойством класса, а это значит, что вам нужно быть особенно осторожным с безопасностью потоков. Убедитесь, что SaveResult () является потокобезопасным; если нет, то вам нужно сделать вызов SaveResult () поточно-безопасным с блокировкой.

Удачи!

...