![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| getme |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 12.9.2008 Репутация: нет Всего: -2 |
Здравсвуйте,
в .NET мало работал, но сегодня понадобилось написать маленькую программульку суть: цикл читает одну линию из файла и делает запрос к удаленному серверу (GET запрос) строк предположительно 30 000 - 40 000 написал вот такой код
Так как опыта в C# нет, прощу немного помочь подскажите что как лучше делать? к примеру объекты Request/Response каждый раз создаются в цикле можно/нужно ли их как вынести выше и переиспользовать или что-то в этом роде? по сути нужно от этого кода получить макс. производительность. Спасибо |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
радикально улучшить, по-моему, не получится
объекты повторно использовать тоже не выйдет - заменить Url у WebRequest нельзя а максимальное время здесь будет уходить на веб-операции, так что остальные мелкие недочёты не играют большой роли их несколько: - возможно, имеет смысл прочитать весь файл сразу (File.ReadAllLines) - часто используемый regex стоит проверять не через статический метод, а создав экземпляр с флагом Compiled (new Regex(string pattern, RegexOptions options)) и используя его - при таком кол-ве потенциальных Match'ей стоит начала сформировать все строки, а потом разом их добавить через метод AddRange - так не будет происходиьт многократное автоувеличение размера списка (выделяется новый массив, в 2 раза больше предыдущего). список для временного хранения этих строк стоит создать с указанным колличеством записей new List<string>(count), где count предлагаю использовать равным предполагаемому кол-ву * 1.5 - строку, состоящую более чем из 2 частей, не стоит получать их суммированием, используй string.Format("{0}: {1}", line, g.Value). причина та же - ненужные выделения памяти на промежуточные варианты но, повторюсь, большой выгоды это не даст Это сообщение отредактировал(а) mihryak - 1.7.2009, 22:05 |
|||
|
||||
| getme |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 12.9.2008 Репутация: нет Всего: -2 |
ОК
регекс заменил на
что касается listBox1.Items.Add(line+": "+g.Value); это просто чтобы видно было что работа исполняется, позже это уберу когда на 100% буду уверен что все ок а так запись будет происходить в csv файл примерно так
Теперь такой вопрос, в файле десть строк=10 запросам почему инфа в listBox1 поступает только после того как все десять запросов выполнятся? визуально выглядит не очень, хотелось бы наблюдать за прогрессом, т.е видеть запрос1, запрос2 и тд. |
||||
|
|||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
поступает-то она сразу, но не сразу отображается, т.к. процесс активно работает в качестве решения можно на каждой итерации (через раз, через 10, 20, 100 итераций) вызывать Application.DoEvents() или вынести эти запросы в отдельный поток, самый простой способ - использовать BackgroundWorker кстати, переход на несколько потоков может серьёзно ускорить эту задачу если есть такая возможность - то польза многократно превысит все вышеуказанные мелочи особо много создавать не стоит, около 20 вполне хватит Это сообщение отредактировал(а) mihryak - 2.7.2009, 10:24 |
|||
|
||||
| getme |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 12.9.2008 Репутация: нет Всего: -2 |
BackgroundWorker пока трудно разобраться с ним.
как сделать так чтобы пошел запрос и до тех пор пока он не завершится следующий не начинался? Если можно маленький пример. |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
твой код именно так и поступает если не дробить задачу на несколько потоков, то и при текущем варианте, и при выносе всего этого кода в BackgroundWorker запросы будут выполняться строго последовательно |
|||
|
||||
| getme |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 12.9.2008 Репутация: нет Всего: -2 |
что то я запарился немного
давай сначала есть форма, кнопка запуска и листбокс на ней, в листбокс будем выводить результат последовательно, т.е прошел запрос, показали результат.
теперь думаю как добраться до listBox1 объекта с метода doWrite. Подскажите плс. |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 19 Всего: 36 |
это здесь лишнее - ни к чему создавать отдельный поток для получения результата фетча, если и так находимся в дополнительном потоке, так что просто вызывай Fetch передачу строк в ListBox можно организовать несколькими способами - можно в класс Fetch передать сам экземпляр через конструктор, а можно, что выгядит более правильным, передать делегат, обрабатывающий добавление строк стоит не забывать, что из доп. потока нельзя изменять UIные компоненты, необходимо сначала перевести выполение в тот поток, в котором они были созданы (основной), через методы контрола Invoke(синхронный) или BeginInvoke(асинхронный). выбор метода в твоём случае непринципиален к слову, BackgroundWorker берёт на себя всю работу по переводу контектса между потоками, он считается более простым по сравнению с работой с потоками напрямую, но мне он не нравится по ряду причин как-то так:
Это сообщение отредактировал(а) mihryak - 2.7.2009, 17:26 |
|||
|
||||
| getme |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 80 Регистрация: 12.9.2008 Репутация: нет Всего: -2 |
все сделал, там немного по другому было, гугл помог
Вам спасибо. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |