Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > На сколько безопасен код?


Автор: DenWPF 20.4.2010, 01:29
вот эту функцию используют много потоков.
на сколько безопасен код?
может как то по другому лучше делать что бы использовались свободные прокси proxy
Код

            string ppp = "";
            try
            {
                ppp = proxy[0];
                proxy.Remove(ppp);
                System.Net.ServicePointManager.Expect100Continue = false;

                byte[] byteArray = Encoding.UTF8.GetBytes(textRequest);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ProtocolVersion = HttpVersion.Version10;
                request.ReadWriteTimeout = timeout;
                request.CookieContainer = cooks;
                request.ContentLength = textRequest.Length;
                request.ContentType = "application/x-www-form-urlencoded";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
                request.Headers.Add("Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7");
                request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.1.8) Gecko/20100202 Firefox/3.5.8 GTBDFff GTB7.0";
                request.KeepAlive = true;
                request.Proxy = new WebProxy(ppp);
                // Отправляем данные запроса
                Stream requestStream = request.GetRequestStream();
                requestStream.Write(byteArray, 0, textRequest.Length);

                // Получаем класс ответа
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                // Читаем ответ
                Stream responseStream = response.GetResponseStream();
                StreamReader readStream = new StreamReader(responseStream, enc);

                string currResponse = readStream.ReadToEnd();
                readStream.Close();
                response.Close();
                proxy.Add(ppp);
                return currResponse;

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
                return SendRequestCook(textRequest, url, cooks, metod);
            }
        }

Автор: jonie 20.4.2010, 09:43
небехопасен. Как минимум в строке 14 (23) идет использование данных другого потока, гд еникто не дает гарантий что они не поменяются:
Код

                request.ContentLength = textRequest.Length; //а вдруг textRequest поменяется?
....
                requestStream.Write(byteArray, 0, textRequest.Length);  //а тут уже может быть другой textRequest


Автор: DenWPF 20.4.2010, 10:25
Код

string textRR = textRequest;
request.ContentLength = textRR.Length;
// Отправляем данные запроса
Stream requestStream = request.GetRequestStream();
requestStream.Write(byteArray, 0, textRR.Length);


такое меня не спасет&


стоп,стооп.
тот код который я дал это статическая функция.
там же этого не может быть!?
все переменные локальны.


Автор: DenWPF 21.4.2010, 11:02
опять же про потоки и безопасность.

вот у меня есть статический List<string> он обновляется из потоков.
когда достигает определного размера я его сохраняю.

так вот нужно ли мне использовать lock в потоке когда я делаю просто .Add() ?

Автор: jonie 21.4.2010, 11:05
DenWPF, да, нужно. И при сохранении весьма желательно это делать... есть правда в .NET 3+ синхронизированные листы - посмотрите в их сторону

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)