Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: русские буквы
Добавлено: 21.09.10 15:53
Автор вопроса: Ishayahu | Web-сайт:
Ответы
Всего ответов: 90
Номер ответа: 16
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #16
Добавлено: 22.09.10 22:29
GC.Collect() джедаи не юзают, инфа 100%
Номер ответа: 17
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #17
Добавлено: 22.09.10 23:34
еще)
Номер ответа: 18
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #18
Добавлено: 22.09.10 23:36
в третьих.. у тебя RunIn объвляена как Shared.. зачем? Параметры правильнее было бы передать в конструкторе.
мммм ну экземпляр то не нужен по сути. чисто механизм запустить. посему и шаред. а далее - уже сам класс занимается. плюс пожалуй, следовало бы сделать Private Sub New ..
Номер ответа: 19
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #19
Добавлено: 22.09.10 23:41
это было бы правильно если бы паттерн Singlton реализовывал, а в твоем случае лучше через конструктор.. так правильнее с точки зрения Design patterns,имхо
Номер ответа: 20
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #20
Добавлено: 22.09.10 23:49
кроме всего прочего.. надо отделять: мухи отдельно, котлеты отдельно.. т.е. по сути,если ты сделал некий wrapper, то не помешало бы сделать инициализацию через конструктор, а запуск через некий метод Run.. а так у тебя все в одном RunIn навалено.. ну да ладно - дело твое.
Номер ответа: 21
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #21
Добавлено: 23.09.10 00:07
AgentFire, реально, ты себе плохо сделал что этот код выложил
Я сейчас поковыряю, но смотри, первое:
Со включенной опцией Option Strict On код не компилится, 5 error'ов.
Кроме того, еще 4 варнинга
Номер ответа: 22
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #22
Добавлено: 23.09.10 00:29
ну это перл, по TCP передавать в BASE64. Брал бы что ли уже сразу XmlSerializer а не Binary. Смысл тут в Binary вообще если ты перекодируешь в текст?
AgentFire, у меня в программе (которая по совместительству является TCP-сервером) почти 17 тысяч строк кода. И единственная строчка которой ты в ней не найдешь - это GC.Collect(). В программе, в которой нет утечек памяти, GC.Collect() не нужна. Если в программе есть утечки памяти GC.Collect() не поможет, только дополинтельно добавит еще и тормозов.
Полная сборка мусора (а именно это и делает GC.Collect) - очень затратная операция, так как нужно пройти по всему графу объектов. Именно поэтому .NET очень редко ее делает, только тогда когда памяти реально не хватает.
Посмотри что делается у тебя. При полуении любого сообщения происходит сборка мусора, зачем? А если будет приходить 500 сообщений в секунду, ты представляешь какие тормоза ты получишь?
Номер ответа: 23
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #23
Добавлено: 23.09.10 00:46
Возвращаясь к сборке мусора, вот пример который все иллюстрирует:
У меня в сеукнду создается около 9000 объектов. Прогармма не выходит за пределы 13 МБ.
Если убрать GC.Collect(), то за секунду создается уже 3.2 млн оъектов (в 350 раз больше), программа не выходит за пределы 14.5 МБ.
Это происходит потому что без вызова GC.Collect принудительно:
1) Сборка мусора выполняется только когда кончается выделеная приложению память
1) Сборка мусора выполняется только по нулевому поколению (по размеру оно обычно примерно равно кеш-памяти процессора)
Так что, как видишь, принудительная сборка мусора - исключительно вредная операция.
Единственное место где ее можно применять - запускать по таймеру, скажем, раз в 5 минут, чтоб подчистить объекты, которые ушли в 1 и 2 поколение, потому что до них сборка будет доходить редко.
Дальше.
Стандартная сигнатура любого Event'а:
Если требуется передать какие-то дополнительные данные, то вместо EventArgs создается наследник от EventArgs.
Номер ответа: 24
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #24
Добавлено: 23.09.10 00:49
Номер ответа: 25
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #25
Добавлено: 23.09.10 00:57
Вообще-то у него не один BackgroundWorker, а 3
Номер ответа: 26
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #26
Добавлено: 23.09.10 01:20
ТРИ?????????????? ппц, ты не опечатался?
Номер ответа: 27
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #27
Добавлено: 23.09.10 10:00
блин, классно и невероятно полезно читать. продолжайте пожалуйста)
1. да, BW у меян три, юзаю я их четко и диспозю по ненадобности.
2. Утечек памяти не должно быть, все проверено, а GC.Collect() вызывал чисто из соображений, чтобы подчистить пару килобайт памяти, которые я только что задиспозил. Спасибо, буду знать, что это лишнее и затратоемкое
3. Base64String - юзал когда не знал о XmlSerializer. да и, по идее, и его я юзать боюсь, т.к. у него внутри разрывы строк, что StreamReader.ReadLine может воспринять некорректно. Сам же Base64String я планирую сжимать Deflate'ом, чтобы работало быстрее и жрало меньше траффика.
4. что можете предложить аналогом к BW ? Ручное создание потоков? Если честно, то в этой среде я не знаю, как инвокнуться обратно в вызывающий поток, чтобы не было ошибки "доступ к контролу из потока который его типо не создавал". а BW сие делает
5. (object sender, EventArgs e). Знаю, задумывался. Но считаю, что мне попроще просто раизить с одним параметром winsock Sender (а в большинстве именно это и нужно), нежели передавать по сути ненужный EventArgs e. Но мнение о дефолтном раизере эвентов я уважаю, и коли настоящие джедаи сие юзают, то я возьму на заметку.
6. "Option Strict On код не компилится, 5 error'ов". Фишка такая, что в коде часто встречаются моменты вроде Dim a = Console.ReadLine. Тип не указан, но студия безошибочно понимает, что я желаю присвоить а тип String. Так что ..
Номер ответа: 28
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #28
Добавлено: 23.09.10 10:08
ЗЫ Парни, там хаус вышел.
Номер ответа: 29
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #29
Добавлено: 23.09.10 11:17
Тебе никто не ставит в упрек тот факт, что не умеешь синхронизировать потоки. Не умеешь - научим. Имхо, твоих знаний достаточно, чтобы разобраться как работать с многопоточной моделью. Страшно другое.. страшно то, что ты, как программист, не придерживаешь основ и правил той платформы, под которую пишешь. Artyom не зря сказал тебе про сигнатуру EventArgs.. твоя задача спроектировать класс таким образом (я не говорю о внутренней реализации, это отдельная тема) чтобы любой другой мог его использовать не задумываясь точно так же как и любой другой класс в NET.
Не надо полагаться на студию.. это она в этом месте угадала. А вполне может быть ситуация, когда та же студия тебе из double сделает float или посчитает что это int.
Номер ответа: 30
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #30
Добавлено: 23.09.10 13:05
такие места я не пропускаю..
синхронизировать - научите! )
EventArgs - так значит, ее все таки юзают джедаи? ^^
и давай еще по 27му посту..