Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: русские буквы Добавлено: 21.09.10 15:53  

Автор вопроса:  Ishayahu | Web-сайт: ishayahu.blogspot.com | ICQ: 329944992 

Ответить

  Ответы Всего ответов: 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
EROS пишет:
в третьих.. у тебя RunIn объвляена как Shared.. зачем? Параметры правильнее было бы передать в конструкторе.

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

Ответить

Номер ответа: 19
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #19 Добавлено: 22.09.10 23:41
следовало бы сделать Private Sub New

это было бы правильно если бы паттерн 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
  1. SW.WriteLine(Convert.ToBase64String(ByteData))

ну это перл, по TCP передавать в BASE64. Брал бы что ли уже сразу XmlSerializer а не Binary. Смысл тут в Binary вообще если ты перекодируешь в текст?

  1.         Finally
  2.             GC.Collect()
  3.         End Try

AgentFire, у меня в программе (которая по совместительству является TCP-сервером) почти 17 тысяч строк кода. И единственная строчка которой ты в ней не найдешь - это GC.Collect(). В программе, в которой нет утечек памяти, GC.Collect() не нужна. Если в программе есть утечки памяти GC.Collect() не поможет, только дополинтельно добавит еще и тормозов.

Полная сборка мусора (а именно это и делает GC.Collect) - очень затратная операция, так как нужно пройти по всему графу объектов. Именно поэтому .NET очень редко ее делает, только тогда когда памяти реально не хватает.

Посмотри что делается у тебя. При полуении любого сообщения происходит сборка мусора, зачем? А если будет приходить 500 сообщений в секунду, ты представляешь какие тормоза ты получишь?

Ответить

Номер ответа: 23
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #23 Добавлено: 23.09.10 00:46
Возвращаясь к сборке мусора, вот пример который все иллюстрирует:

  1.         Do
  2.             Dim Start As DateTime = Now
  3.             Dim Count As Integer = 0
  4.  
  5.             Do
  6.                 Dim Obj As New Object
  7.                 Obj = Nothing
  8.                 GC.Collect()
  9.                 Count += 1
  10.  
  11.             Loop While Now.Subtract(Start).TotalSeconds < 1
  12.             Console.WriteLine(Count)
  13.         Loop

У меня в сеукнду создается около 9000 объектов. Прогармма не выходит за пределы 13 МБ.
Если убрать GC.Collect(), то за секунду создается уже 3.2 млн оъектов (в 350 раз больше), программа не выходит за пределы 14.5 МБ.
Это происходит потому что без вызова GC.Collect принудительно:
1) Сборка мусора выполняется только когда кончается выделеная приложению память
1) Сборка мусора выполняется только по нулевому поколению (по размеру оно обычно примерно равно кеш-памяти процессора)

Так что, как видишь, принудительная сборка мусора - исключительно вредная операция.
Единственное место где ее можно применять - запускать по таймеру, скажем, раз в 5 минут, чтоб подчистить объекты, которые ушли в 1 и 2 поколение, потому что до них сборка будет доходить редко.

Дальше.
  1.     Public Event OnDataReceive(ByVal Sender As Winsock, ByVal Data As Object)
  2.     Public Event OnConnect(ByVal Sender As Winsock)
  3.     Public Event OnClientAccept(ByVal Sender As Winsock)
  4.     Public Event OnConnectionLost(ByVal Sender As Winsock)
  5.     Public Event OnConnectFail(ByVal Sender As Winsock)

Стандартная сигнатура любого Event'а:
  1. (object sender, EventArgs e)


Если требуется передать какие-то дополнительные данные, то вместо EventArgs создается наследник от EventArgs.

Ответить

Номер ответа: 24
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #24 Добавлено: 23.09.10 00:49
AgentFire, первое что бросается в глаза это BackgroundWorker.. настоящие джедаи его не юзают.
Я не гуру, но я бы тоже от него избавился.

Ответить

Номер ответа: 25
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #25 Добавлено: 23.09.10 00:57
Вообще-то у него не один BackgroundWorker, а 3

Ответить

Номер ответа: 26
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #26 Добавлено: 23.09.10 01:20
Вообще-то у него не один BackgroundWorker, а 3

ТРИ?????????????? ппц, ты не опечатался?

Ответить

Номер ответа: 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.
студия безошибочно понимает, что я желаю присвоить а тип String.

Не надо полагаться на студию.. это она в этом месте угадала. А вполне может быть ситуация, когда та же студия тебе из double сделает float или посчитает что это int.

Ответить

Номер ответа: 30
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #30 Добавлено: 23.09.10 13:05
такие места я не пропускаю..
синхронизировать - научите! )
EventArgs - так значит, ее все таки юзают джедаи? ^^

и давай еще по 27му посту..

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам