StreamReader ThreadSafe Проблема? Возможно? - PullRequest
0 голосов
/ 05 февраля 2012

Полагаю, это не работает из-за того, что StreamReader не является потокобезопасным (не знаю, как это исправить, Google не поможет)

В любом случае, я пытался понять, что именно не так с этим кодом, он работает 80% времени, в других случаях он не может анализировать входящие пакеты и просто отбрасывает их.

Это пустота для http-подобного tcp-сервера, который я пишу. он работает точно так же, как http-пакет, но заголовок «CONTENT-LENGTH» сообщает ему длину данных пакета (полезную нагрузку). Это где проблема происходит. Может кто-нибудь предложить мне, как улучшить это и исправить это? потому что я полностью потерян.

    void InternalStart()
    {

        bool continueWhile = true;
        while (continueWhile)
        {
            if (SR.EndOfStream)
            {
                continueWhile = false;
                break;
            }
            if (par_ReadStatus != ReadStatusEnum.WaitingForPayload)
            {
                int charCode = SR.Peek();
                if (charCode == -1)
                {
                    continueWhile = false;
                    break;
                }
                string outputLine = "";
                outputLine = SR.ReadLine();
                ReadLine(outputLine);
            }
            else if (par_ReadStatus == ReadStatusEnum.WaitingForPayload)
            {
                int length = int.Parse(par_ParsingPacket.Attributes["CONTENT-LENGTH"]);
                char[] array = new char[length];
                for (int i = 0; i < length; i++)
                {
                    array.SetValue(Convert.ToChar(SR.Read()), i);
                }
                string payload = new string(array);
                ReadLine(payload);
            }
        }
        if (ReadEnd != null)
        {
            ReadEnd();
        }
    }

1 Ответ

3 голосов
/ 05 февраля 2012

StreamReader не является потокобезопасным, (не знаю, как это исправить, Google не поможет)

Простой.Уровень программиста для начинающих: не читайте StreamReader из более чем одного потока.Проект, пытающийся это сделать, - это неспособность понять, что такое поток и как эффективно работает многопоточное программирование.

Нет необходимости, чтобы несколько потоков обращались к одному потоковому считывателю вообще.Вы должны изолировать потоки до и назначить потоковое считыватель исключительно конкретному потоку на время обработки данных.Если вы хотите работать профессионально и быстро, вы работаете как IIS и высасываете данные в потоках инфраструктуры, которые затем отрабатывают рабочие пакеты в рабочую очередь, и несколько потоков отрабатывают.отключите сокеты и используйте механизмы асинхронных сокетов, чтобы убедиться, что вы не тратите 1000 потоков на выполнение 1000 операций без больших затрат.

Во всяком случае, я пытался понять, что именно не такс этим кодом

Ах - хорошая попытка.К сожалению, вы не говорите нам, какая у вас действительно проблема, и ваш код ничего не показывает с использованием потоков, поэтому в конце ваш вопрос и код не имеют смысла в комбинации.

...