Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2016, 18:16   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Нужно оптимизировать код

Всем доброго времени суток.
Есть следующий код:
Код:
void LoadingThread()
{
	HttpWebRequest rq=(HttpWebRequest)WebRequest.Create(requeststring); // глобальная string, содержащая браузерную строку страницы
	HttpWebResponse rs=(HttpWebResponse)rq.GetResponse();
	Stream loader=rs.GetResponseStream();
	int ch=0;
	loadingdata=""; // глобальная string, в которую грузится код страницы
	while (!loaded) // глобальная bool, нужна для продолжения работы за пределами этого потока
	{
		try
		{
			ch=loader.ReadByte(); // оптимизировать нужно это
		} catch
		{
			ch=-1;
			loadingdata="";
		}
		if (ch!=-1)
			loadingdata+=(char)ch;
		else
			loaded=true;
	}
	loader.Close();
}
// потом с загруженными данными я творю то, что мне нужно
Собственно, именно так я поступил потому, что не знаю длину потока (loader.Length выдаёт исключение). Побайтное чтение - это оочень долго, при том, что мне нужно загрузить всю страницу.
Как можно это дело улучшить ?
P. S. Кириллица так не распознаётся - это я знаю. В принципе - для меня это не проблема. Хотя, если есть простой способ исправить - я не буду возражать.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.04.2016, 18:26   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

оберните в StreamReader с выбором нужной кодировки и у него уже ReadToEnd()
переделаю мою процедуру, думаю поможет.
Код:
	private static string GetToString(string url, string referer = null)
	{
		try
		{
			var client = (HttpWebRequest)HttpWebRequest.Create(url);
			client.UserAgent = "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17";
			client.Accept = "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
			client.Headers["Accept-Language"] = "ru-RU,ru;q=0.9,en;q = 0.8";
			client.Headers["Accept-Encoding"] = "gzip, deflate";
			client.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
			if (referer != null)
			{
				client.Referer = referer;
			}

			using (var resp = (HttpWebResponse)client.GetResponse())
			{
				if (resp.StatusCode == HttpStatusCode.OK)
				{
					using (var web = resp.GetResponseStream())
					{
						using (var sr = new StreamReader(str, Encoding.UTF8)) //Вот тут идет выбор кодировки, у меня стоит UTF8
						{
							return sr.ReadToEnd();
						}
					}
				}
			}
		}
		catch
		{
			return nulll;
		}

		return null;
	}
данный код так же обрабатывает и сжатые страницы.(и косит под браузер)
(надеюсь не напутал нигде при переносе под вашу ситуацию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Alex11223; 19.04.2016 в 19:44. Причина: форматирование
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 18:41   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
У меня это изначально должен быть поток. Обычный Thread не принимает функции с параметрами (или я чего то не знаю).
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.04.2016, 18:42   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам кто-то запрещает вызвать мою функцию из кода потока или переделать ее чисто под поток?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 18:53   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вам кто-то запрещает вызвать мою функцию из кода потока или переделать ее чисто под поток?
Чисто под поток - это разве что все параметры перегнать в глобальные. А так - всё ок.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.04.2016, 19:05   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в поток можно передать параметр между прочим.
глобальные переменные ограничивают вас одним потоком.

вам нужен один параметр, второй параметр функции у вас будет null.
его можно и вырезать в принципе, просто в моем коде он есть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 19:09   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Пепел Феникса
Такой вопрос:
Код:
using (var sr = new StreamReader(str, Encoding.UTF8))
{
	return sr.ReadToEnd();
}
Что за str в параметрах вызова конструктора ?
Я посмотрел по документации - это "путь к файлу для чтения".
Собственно я и не могу понять, зачем это ... И с чем его есть.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 19.04.2016, 19:44   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это я при адаптации таки накосячил
там web должен быть.
Код:
private static string GetToString(string url, string referer = null)
        {
                try
                {
                    var client = (HttpWebRequest)HttpWebRequest.Create(url);
                    client.UserAgent = "Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17";
                    client.Accept =
                        "text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
                    client.Headers["Accept-Language"] = "ru-RU,ru;q=0.9,en;q = 0.8";
                    client.Headers["Accept-Encoding"] = "gzip, deflate";
                    client.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                    if (referer != null)
                    {
                        client.Referer = referer;
                    }
                    using (var resp = (HttpWebResponse)client.GetResponse())
                    {
                        if (resp.StatusCode == HttpStatusCode.OK)
                        {
                            using (var web = resp.GetResponseStream())
                            {  
                    using (var sr = new StreamReader(web, Encoding.UTF8))  //Вот тут идет выбор кодировки, у меня стоит UTF8
                    {
                        return sr.ReadToEnd();
                    }
                            }
                        }
                    }
                }
                catch
                {
                    return nulll;
                }
            return null;
        }
просто исходный код немного сложнее, вам это ни к чему
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 19.04.2016, 19:47   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Видимо туда надо было передать web созданный выше, а не str.

А вообще лучше не париться с HttpWebRequest и взять WebClient или HttpClient (.NET 4.5).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 19.04.2016, 22:00   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

В общем, я модифицировал код под себя и свои нужды (всё работает).
Код:
private void LoadingThread()
{
	try
	{
		HttpWebRequest client=(HttpWebRequest)HttpWebRequest.Create(requeststring);
		client.UserAgent="Opera/9.80 (Windows NT 6.2; Win64; x64) Presto/2.12.388 Version/12.17";
		client.Accept=
				"text/html, application/xml;q=0.9, application/xhtml+xml, image/png,"+
				"image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1";
		client.Headers["Accept-Language"]="ru-RU,ru;q=0.9,en;q = 0.8";
		client.Headers["Accept-Encoding"]="gzip, deflate";
		client.AutomaticDecompression=(DecompressionMethods.GZip | DecompressionMethods.Deflate);
		HttpWebResponse resp=(HttpWebResponse)client.GetResponse();
		if (resp.StatusCode==HttpStatusCode.OK)
		{
			Stream loader=resp.GetResponseStream();
			StreamReader reader=new StreamReader(loader);
			loadingdata=reader.ReadToEnd(); // loadingdata - глобальная string
		} else {}
	}
	catch {}
}
Кириллицу грузит, почти всё хорошо. Единственная проблема - это поведение при разрыве связи: по завершении потока почему то выполнение потока начинается сначала. Но это не проблема: моя конструкция позволяет пресекать такие ситуации - поток убивается принудительно, если он работает больше определённого времени.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизировать код. Demetros Microsoft Office Excel 6 29.04.2015 00:11
Оптимизировать код Алексей_2012 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 58 19.02.2013 00:13
Реестр, нужно оптимизировать код Человек_Борща Общие вопросы Delphi 3 06.11.2010 13:40
нужно оптимизировать код adwaer PHP 11 21.03.2010 02:20
Оптимизировать код. Манжосов Денис :) Общие вопросы Delphi 1 20.10.2008 19:06