|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79exec88так самого то dbf еще нет! А когда он уже будет с данными, то смысла со стримом уже нет, его можно приэттачить по имени файла. Или я неправильно понял? Вас вообще трудно понять :-) Вы сказали, что дбф формируется хранимкой. Соттветственно, все данные, необходимые для генерации, в этой хранимке доступны. Так почему же вместо ненормальной записи в файл просто не выдать эти данные клиенту в рекодсете? Я тоже не совсем Вас понимаю. 1) Мой вариант. До отправки письма есть пустой dbf - нужной структуры и кодировки. Есть хранимка, которая сама заполняет этот dbf файл. Сгенерить снуля dbf хранимка не может, только вставить данные в имеющийся (в t-sql я не нашел как создать dbf из под хранимки без использования clr). Когда заполненный dbf файл уже на диске есть, он эттачится к письму через FilePath. 2) Вы предлагаете. Есть данные полученные хранимкой, Вы имеете в виду DataTable или что - то в этом духе, их кидаем с стрим. Как я понял, Вы имеете в виду, что есть еще dbf файл (откуда он, это пустышка?). И можно в эттаче склеить dbf файл со стримом? Может код черкнете, понятнее станет... ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 14:26 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79Изопропилнехорошо реализован класс MailSender +1. я наследую свой класс от этого шаблона Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
А вообще для приведенной реализации MailSender вообще Dispose не нужно Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
А почему var mess = new MailMessage(from, to)) Чтобы не утруждаться писать MailMessage? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 14:33 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
exec881) Мой вариант. До отправки письма есть пустой dbf - нужной структуры и кодировки. Есть хранимка, которая сама заполняет этот dbf файл. Сгенерить снуля dbf хранимка не может, только вставить данные в имеющийся (в t-sql я не нашел как создать dbf из под хранимки без использования clr). Когда заполненный dbf файл уже на диске есть, он эттачится к письму через FilePath. 2) Вы предлагаете. Есть данные полученные хранимкой, Вы имеете в виду DataTable или что - то в этом духе, их кидаем с стрим. Как я понял, Вы имеете в виду, что есть еще dbf файл (откуда он, это пустышка?). И можно в эттаче склеить dbf файл со стримом? Может код черкнете, понятнее станет... Я имею ввиду, что заниматься генерацией файла (или его заполнением) из ХП - неверно архитектурно. Если очень хочется, можно SSIS использовать Но я бы получил на клиента рекордсет, и из клиента закидывал бы в файл. А если посильнее напрячься, можно и на лету генерировать, но нужно разобраться со структурой dbf ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 14:41 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
exec88Чтобы не утруждаться писать MailMessage? да ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 14:42 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79exec881) Мой вариант. До отправки письма есть пустой dbf - нужной структуры и кодировки. Есть хранимка, которая сама заполняет этот dbf файл. Сгенерить снуля dbf хранимка не может, только вставить данные в имеющийся (в t-sql я не нашел как создать dbf из под хранимки без использования clr). Когда заполненный dbf файл уже на диске есть, он эттачится к письму через FilePath. 2) Вы предлагаете. Есть данные полученные хранимкой, Вы имеете в виду DataTable или что - то в этом духе, их кидаем с стрим. Как я понял, Вы имеете в виду, что есть еще dbf файл (откуда он, это пустышка?). И можно в эттаче склеить dbf файл со стримом? Может код черкнете, понятнее станет... Я имею ввиду, что заниматься генерацией файла (или его заполнением) из ХП - неверно архитектурно. Если очень хочется, можно SSIS использовать Но я бы получил на клиента рекордсет, и из клиента закидывал бы в файл. А если посильнее напрячься, можно и на лету генерировать, но нужно разобраться со структурой dbf Да, я думал, но C# не очень изящно работает с dbf. Видать для него это уже старая технология. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 15:03 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79А если посильнее напрячься, можно и на лету генерировать, но нужно разобраться со структурой dbf exec88Да, я думал, но C# не очень изящно работает с dbf. Видать для него это уже старая технология. да какая разница в какой формат сериализовать. DBF прост как 3 копейки ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2013, 15:20 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1001209&msg=13855091 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1001209&msg=13855388 Тоже показался интересным такой вариант реализации шаблона Dispose . Хотя бы потому, что в ещё одной реализации этого шаблона, взятой из МСДН все наследники базового класса, в котором этот шаблон реализован, должны скопировать кучу кода из этого базового класса. См., например, раздел "Implementing the dispose pattern for a derived class" - по сути, от базового класса остаётся только Dispose() без параметров. А в реализации автора по двум первым ссылкам бОльшая часть базового класса - переиспользуемая (надо только переопределить два метода), да плюс освобождение ресурсов явно сгруппировано по управляемым и неуправляемым. Но вот с реализациями в наследниках этого базового класса у меня возникли вопросы. Если в примере в МСДН более-менее расписано, то тут - нет. Основной вопрос, конечно, в сложности. Простые примеры понятны, а вот что будет, если достаточно сильно усложнить? Нужно же в правильном порядке и в нужных местах вызывать базовые реализации, освобождения делать и прочее - вот в этом-то и вопрос, где и что делать в случае достаточно сложной иерархии классов. Я разобрал такой случай: класс наследуется от класса, унаследованного от DisposableBase, и имеет члены, унаследованные от DisposableBase. Вот моя реализация (с муляжами неуправляемых ресурсов в виде переменных int), где описанный класс - Е: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Вот весь код с промежуточными классами (А, B и т. п.) и с проверочной программой: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126.
А вот вывод, относящийся к освобождению ресурсов класса Е: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
По-моему, всё правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:00 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Мой DisposableBase - это копия DisposableTemplate у Arm79. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:02 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
А вообще, мне вся эта возня с Dispose напоминает ту же возню с деструкторами в С++. Тоже помню, что в учебниках по С++ писали такие портянки со сложными наследованиями, а потом в деструкторах писали сообщения, чтобы понять, что и когда вызывается. Вот и тут один в один. В связи с этим у меня в голове сидит вопрос - а нафига?! Нафига всё это автоматическое управление памятью, чтобы облегчить работу программистам, когда на самом деле всё чуть ли не сложнее стало, чем было в С++? За что боролись, на то и напоролись? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:05 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, Dispose - не для освобождения памяти. а для освобождения неуправляемых ресурсов. авторЗа что боролись, на то и напоролись? не нравится - пишите на с++ ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:22 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
ИзопропилHomeCoder, Dispose - не для освобождения памяти. а для освобождения неуправляемых ресурсов. Я, может, неправаильно где-то выразился... Или мы говорим об одном и том же разными словами... Я просто хотел, чтобы посмотрели на мой пример работы с Dispose Pattern в случае сложной иерархии классов. Я вот проверку набросал в консольном приложении - вроде, всё работает. ИзопропилавторЗа что боролись, на то и напоролись? не нравится - пишите на с++ Да я не веду речь о "нравится/не нравится". Я просто столкнулся с такой мыслью и хочу узнать у коллег - есть ли у них такое же ощущение. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:39 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoderесть ли у них такое же ощущение. Нет. В плюсах - деструктор надо было писать и вызывать всегда, для всех классов. В шарпе - диспоз только тогда, когда без него никак. Из всех классов, которые я написал, пожалуй только парочка была с реализацией этого интерфейса.... Разница весьма ощутимая. 100% и 0.001%. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 11:49 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
А вопрос то в чем? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 12:08 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, авторА вообще, мне вся эта возня с Dispose напоминает ту же возню с деструкторами в С++. говорите правильно Dispose это просто паттрен, по рекомендации мс и как правило, для освобождения нр, но мс сам то не всегда придерживается кое где этого, что нам мешает в местячковом коде применить его и для не освобождения ресурсов? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 13:35 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Arm79А вопрос то в чем? Я хотел узнать, правильно ли я использую этот паттерн в случае со сложным наследованием-композицией классов. В МСДН разобран только самый простой пример. У вас разобран только самый простой пример. - Когда мы просто наследуемся от базового класса, который реализует IDisposable. Я же разбираю пример, когда мы наследуемся от класса, реализующего базовый абстрактный класс, реализующий IDisposable (и шаблон Dispose), да плюс ещё имеем в композиции объекты классов, унаследованных от класса, реализующего тот же базовый абстрактный класс, реализующий IDisposable. Надеюсь, понятно объяснил. В коде это выглядит так, как я показал - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1001209&msg=16242281 Теперь я словами поясню, что я делаю в классе Е. Основное я выделю жирным шрифтом. Извиняюсь, что длинно, но нигде ведь не написано, как надо делать. Начинается всё с того, что я вызываю метод Dispose в объекте класса Е - см. код в конце Program.Main. Поскольку метод Dispose объявлен и реализован только в самом базовом абстрактном классе DisposableBase, который реализует шаблон Dispose (и интерфейс IDisposable), то вызывается именно этот метод. В методе Dispose сначала вызывается абстрактный метод DisposeManagedResources. Поскольку этот метод переопределён в каждом унаследованном классе, то в объекте типа Е будет вызван вариант с перегрузкой в классе Е. В методе DisposeManagedResources я должен освободить управляемые ресурсы. Поскольку у класса Е управляемые ресурсы находятся как в иерархии наследования, так и в композиции, то я должен освободить и то, и другое. В композиции я освобождаю управляемые ресурсы, вызвав EB.Dispose(), а в наследовании - вызвав базовую реализацию DisposeManagedResources. Затем в методе Dispose вызывается абстрактный метод DisposeUnmanagedResources. Опять же, вызывается самая последняя по наследованию реализация, т. к. этот метод тоже переопределён во всех унаследованных классах. Неуправляемые ресурсы освобождаются путём собственно освобождения неуправляемых ресурсов (у меня этот "зануление" импровизированного указателя на файл), плюс вызовом базовой реализации метода DisposeUnmanagedResources. Основные концепции такого комплексного освобождения: 1. Шаблон в данной реализации (когда код освобождения ресурсов находится в специальных методах DisposeManagedResources и DisposeUnmanagedResources) предполагает, что в каждом последующей иерархии наследования эти методы будут переоределяться. При этом в каждом переопределении должна быть вызвана базовая реализация этих методов. 2. Освобождение управляемых ресурсов в иерархии наследования происходит в методе DisposeManagedResources через вызов базовой реализации метода DisposeManagedResources. Освобождение управляемых ресурсов в композиции происходит в методе DisposeManagedResources через вызовы методов Dispose для всех ресурсов в композиции. 3. Освобождение неуправляемых ресурсов в иерархии наследования происходит в методе DisposeUnmanagedResources через вызов базовой реализации метода DisposeUnmanagedResources. Освобождение неуправляемых ресурсов в композиции происходит в методе DisposeUnmanagedResources через собственно специальный код освобождения для каждого неуправляемого ресурса в композиции. Я проверил всю эту простынку в коде, привёл код здесь - любой может запустить и проверить. Вроде, всё по простынке делается. Я только хочу узнать, правильно ли я применяю данный шаблон в таком сложном случае? Правильна ли последовательность освобождения ресурсов? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 19:51 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Вы, конечно, можете говорить, что Dispose редко где применяете, и такие огромные конструкции не нужны. Однако, если посмотреть вглубь любого класса .NET, то он так или иначе в своих базовых классах реализует IDisposable. Потому что это для нас .NET абстрагирует всё в управлении памятью, а на самом деле он работает со вполне реальными объктами в памяти, поэтому у классов .NET полно реализаций освобождения. Из вышеприведённой простыни я могу сделать такой вывод: если в нашем классе где-то в иерархии наследования или в композиции реализуется IDisposable (т. е. используется класс, работающий с неуправляемыми ресурсами), то и нашему классу желательно реализовывать шаблон Dispose - чтобы структурировать логику освобождения ресурсов, а не где попало вызывать Dispose базового класса или объекта из композиции. Правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 19:57 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Я там, в своём коде , привёл вывод последовательности вызовов освобождений для такой сложной иерархии. Очень похоже на то, как плюсовики трясутся над правильным порядком вызова деструкторов в своих сложных иерархиях классов. Только у них две заботы: освобождение памяти и вызов базовых деструкторов. А у нас - четыре: освобождение управляемой памяти и вызов базовых освободителей управляемой памяти, освобождение неуправляемой памяти и вызов базовых освободителей неуправляемой памяти. Поэтому я и говорю, что дотнетчикам гораздо больше головной боли, чем плюсовикам, если начать тесно работать с неуправляемыми ресурсами. Кто-нибудь вообще над подобным задумывался? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 20:05 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
авторосвобождение управляемой памяти Вместо "памяти" там везде "ресурсы" лучше поставить. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 20:06 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, Вы как то мудрено завернули пример, можно же проще ( экономьте наше время, и желание разбираться) это? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
если да, так в принципе эта фишка к диспозе не относится, обыкновенные заглушки, для переопределения в последующих классах применяются сплошь и рядом даже своя специфика в названиях, порядок освобождения нр абсолютно не играет роли. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 20:42 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Где-то в степи, ну, типа того. Только у вас в наследовании всего лишь, а у меня ещё и в композиции. Ну да, переопределять в наследнике и вызывать потом ещё и реализацию через base - это к более общим практикам относится, чем только к Dispose. Вобщем, я пока подвохов в своём подходе не вижу. Разве что высвобождать неуправляемые ресурсы ещё рекомендуют через try/finally в блоке finally - ну чтобы точно освободились. А ещё какая-то практика есть, чтобы после Dispose или просто, когда объект уже не нужен, назначать объектам null - это что, быстрее и вернее заставит сборщика мусора на самом деле освободить ресурсы, или это маразм и перестраховка сиплюсплюсников? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 21:56 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
Понимаете, если вот это всё вместе собрать: - Dispose, - Dispose(bool), - ~Finalize, - не забыть присвоить null, - разделяем высвобождение управляемых и неуправляемых ресурсов, - неуправляемые - в finally (через try/finally) то получается, что плюсовики просто детскими забавами занимаются. Им всего-то надо вызвать деструкторы и занулить указатели. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 22:00 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
using и прочий SafeHandle - это когда у вас где-то локально неуправляемое (но под управляемой обёрткой) что-то создаётся, типа файла или там соединения с БД, и вы тут же это, после использования, высвобождаете. А когда у вас неуправляемый ресурс или пусть даже управляемая обёртка над неуправляемым ресурсом - часть композиции или наследования, то тут как раз вся эта ворожба с Dispose и всплывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 22:04 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoder, Да никаких практик нет, сборщик мусора то и вообще не знает ни про какие диспозе. вся магия заключается в переопределении метода финализатора type Object при определении объекта с переопределенным методом, это объект помещается в таблицу объектов с у которых есть финализатор. вот и все, при недостижении и срабатывании уборщика вызывается метод финализатора ( а там исполняется код освобождения нр) если конечно программист заранее этот код не вызвал, так сказать защита от дурака срабатывает.. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 22:08 |
|
SmtpClient, проблема, вскипает мозк, помогите плиз
|
|||
---|---|---|---|
#18+
HomeCoderЯ же разбираю пример, когда мы наследуемся от класса, реализующего базовый абстрактный класс, реализующий IDisposable (и шаблон Dispose), да плюс ещё имеем в композиции объекты классов, унаследованных от класса, реализующего тот же базовый абстрактный класс, реализующий IDisposable. Надеюсь, понятно объяснил. В коде это выглядит так, как я показал - http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1001209&msg=16242281 В общем случае наследник от класса, в свою очередь наследующего от абстрактного класса DisposableBase, по поведению ничем не отличается от классов, наследующих от других классов. Так что вы правильно применяли override HomeCoder1. Шаблон в данной реализации (когда код освобождения ресурсов находится в специальных методах DisposeManagedResources и DisposeUnmanagedResources) предполагает, что в каждом последующей иерархии наследования эти методы будут переоределяться. При этом в каждом переопределении должна быть вызвана базовая реализация этих методов. Нет, не верно. Они МОГУТ переопределяться, но не обязательно должны. Например, в наследнике никаких иных объектов с IDisposable можно не объявлять, поэтому и переопределять DisposeManagedResources нет смысла (за исключением наследования от абстрактного класса). А вызывать или нет базовую реализацию в переопределенном методе - на совести программиста. Ведь метод может быть и абстрактным, и банально пустым. Или работа идет с protected членами. HomeCoderЯ только хочу узнать, правильно ли я применяю данный шаблон в таком сложном случае? Правильна ли последовательность освобождения ресурсов? Да HomeCoderИз вышеприведённой простыни я могу сделать такой вывод: если в нашем классе где-то в иерархии наследования или в композиции реализуется IDisposable (т. е. используется класс, работающий с неуправляемыми ресурсами), то и нашему классу желательно реализовывать шаблон Dispose - чтобы структурировать логику освобождения ресурсов, а не где попало вызывать Dispose базового класса или объекта из композиции. Правильно? Нет. Например, в полях может быть объявлен SqlConnection con. А в методе можно вызывать: using (con = new SqlConnection()) { чего то там } HomeCoderА у нас - четыре: освобождение управляемой памяти и вызов базовых освободителей управляемой памяти, освобождение неуправляемой памяти и вызов базовых освободителей неуправляемой памяти. Поэтому я и говорю, что дотнетчикам гораздо больше головной боли, чем плюсовикам, если начать тесно работать с неуправляемыми ресурсами. Кто-нибудь вообще над подобным задумывался? Конечно. Я может вам тайну открою, но работа с неуправляемыми ресурсами (не имеющими обертки в Net) не настолько частая операция. Мне пришлось работать за несколько лет только один раз - когда подключал сишную либу для криптоопераций. В общем, так DisposeUnmanagedResources и появился в шаблоне. Что касается шаблона, то несколько ремарок: 1) Использование финализатора на самом деле замедляет процесс "обнуления" объекта, так как он помещается в специальную очередь отдельно от остальных объектов 2) Финализатор в этом шаблоне нужен только для неуправляемых ресурсов. Если их нет, его можно упростить и выкинуть и финализатор, и DisposeUnmanagedResources 3) В шаблоне метод DisposeUnmanagedResources правильнее делать не абстрактным, а виртуальным. Тогда не обязательно каждый раз его переопределять в наследнике. HomeCoderА ещё какая-то практика есть, чтобы после Dispose или просто, когда объект уже не нужен, назначать объектам null - это что, быстрее и вернее заставит сборщика мусора на самом деле освободить ресурсы, или это маразм и перестраховка сиплюсплюсников? сборщик мусора он на то и сборщик, что работает сам. Стратегия работы сборщика может задаваться например в конфиге. Разумеется, можно вызвать и вручную GC.Collect, но это признак плохого тона. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2014, 22:14 |
|
|
start [/forum/topic.php?fid=20&msg=38132441&tid=1402719]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 158ms |
0 / 0 |