|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
Вот есть такое предупреждение о работе с диспосабл обьектами: http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(CA2000);k(TargetFrameworkMoniker-.NETFramework,Version=v4.0);k(DevLang-csharp)&rd=true Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
т.е. предлагают любой такой обьект вручную обнулять, а то в случае возникновения исключения обьект никогда не будет собран сборщиком мусора. Почему так произойдет? Почему сборщик мусора не сможет его собрать? Например надо-ли например DataSet таким образом обнулять после каждого использования? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 05:02 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
Если ссылка остается, как например с хендлерами, сборщик проходит мимо. Совет, уничтожайте инстанс класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 05:26 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
это речь идет об unmanaged ресурсах, типа файлов, верно? А стандартные дотнетовские классы, типа датасетов будут уничтожены и так? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 05:31 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
stenfordт.е. предлагают любой такой обьект вручную обнулять, а то в случае возникновения исключения обьект никогда не будет собран сборщиком мусора. Там сказано что "an exceptional event might occur that will prevent the finalizer of the object from running". То есть finalizer может не выполниться. stenfordПочему сборщик мусора не сможет его собрать? Всё он сможет, не волнуйся. При условии что на этот объект нет ссылок. stenfordНапример надо-ли например DataSet таким образом обнулять после каждого использования? Не нужно т.к. метод Dispose в DataSet ничего не делает и присутствует в нем только из-за наследования. В общем же случае экземпляр класса реализующий IDisposable следует окружать в using() { ... } или вызывать Dispose() самому. Сборка мусора обширная тема. Советую прочитать книгу Рихтера CLR via C#. Хотя бы главу посвященную GC. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.05.2013, 11:09 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
ок, такй вопрос - если вызвать Dispose() у большого обьекта который занимает много места, тот-же датасет, то становится-ли его память доступна для других обьектов еще до того как до него добрался сборщик мусора? т.е. помечается-ли эта память как свободная для новых обьектов процесса? Т.е. скажем такая ситуация - пользователь постоянно открывает новые окна с гридом, в которые закачивается много данных, скажем 50М, если ждать пока сборщик подберет мусор - процесс может сильно разрастись в размерах, а вот если каждый раз память из-под грида диспозится и переиспользуется для нового грида? или такое в принципе невозможно в .net? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 08:28 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
Первая проблема, которая решается с помощью Dispose() это освобождения системных хэндлеров WinApi. В случае DataSet мы имеем только действующее соединение с БД. Если соединение закрыто, GC на запуске утилизирует ненужные более ссылки DataSet, это происходит не сразу, потому как GC управляется отдельным сервисом, в отдельном потоке по требованию или расписанию. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.05.2013, 08:42 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
stenfordесли вызвать Dispose() у большого обьекта который занимает много места, тот-же датасет, то становится-ли его память доступна для других обьектов еще до того как до него добрался сборщик мусора? т.е. помечается-ли эта память как свободная для новых обьектов процесса? Нет и нет. В задачу Dispose() входить освободить т.н. неуправляемые ресурсы находящиеся вне зоны ответственности CLR/GC. Это освобождение может также выполнятся финализатором. IDisposable же нужен чтобы выполнить освобождение сразу как только ресурс стал ненужен. stenfordТ.е. скажем такая ситуация - пользователь постоянно открывает новые окна с гридом, в которые закачивается много данных, скажем 50М, если ждать пока сборщик подберет мусор - процесс может сильно разрастись в размерах, а вот если каждый раз память из-под грида диспозится и переиспользуется для нового грида? или такое в принципе невозможно в .net? Во-первых, следует определиться нужно ли грузить данные в таких объемах. Постраничное разбиение и ленивая подрuузка могут уменшить кол-во используемой памяти и вопрос отпадет сам собой. Во-вторых, если такие объемы в самом деле нужны, то следует убеждаться что на неиспользуемые объекты не остается ссылок и предоставить GC освободить их или вручную вызывать GC.Collect() при закрытии формы. WPFВ случае DataSet мы имеем только действующее соединение с БД. Не вводи человека в заблуждение. DataSet не держит соединения с БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.05.2013, 16:30 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
bazileНет и нет. В задачу Dispose() входить освободить т.н. неуправляемые ресурсы находящиеся вне зоны ответственности CLR/GC. Это освобождение может также выполнятся финализатором. IDisposable же нужен чтобы выполнить освобождение сразу как только ресурс стал ненужен. непонятна такая вещь - если я не вызову Dispose(), то обьект через некоторое время будет уничтожен сборщиком мусора, а неуправляемые ресурсы будут все равно освобождены т.к. сборщик мусора вызовет Finalize() который и освободит их, верно? Что тогда таким образом сигнализирует CA2000: Dispose objects before losing scope - всего-лишь то, что неуправляемые ресурсы проживут в памяти немного дольше, чем если-бы я задиспозил их сразу? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 02:39 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
Но тогда непонятно следующее предложение - Because an exceptional event might occur that will prevent the finalizer of the object from running, the object should be explicitly disposed instead. Как это файнолайзер может не выполниться из-за исключения? При чем тут исключение в коде, если файнолайзер запускается сборщиком мусора? Почему вдруг сборщик мусора окажется неспособным вызвать этот файнолайзер? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 02:44 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
stenford, по поводу стартового топика - действительно нужно вернуть из метода закрытый SerialPort ? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 08:59 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
stenfordНо тогда непонятно следующее предложение - Because an exceptional event might occur that will prevent the finalizer of the object from running, the object should be explicitly disposed instead. Как это файнолайзер может не выполниться из-за исключения? При чем тут исключение в коде, если файнолайзер запускается сборщиком мусора? Почему вдруг сборщик мусора окажется неспособным вызвать этот файнолайзер? Все просто. Во время вызова dispose может произойти исключение и сборщик мусора не отработает должным образом. Посему using нельзя использовать ,например, для wcf proxy. http://dave-black.blogspot.ru/2012/03/dont-use-using-with-wcf-proxy.html=]тынц ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 09:55 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 09:56 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
SeVaВсе просто. Во время вызова dispose может произойти исключение и сборщик мусора не отработает должным образом. Посему using нельзя использовать ,например, для wcf proxy. я так понял что мой первоначальный пример не про using и не про исключение в Dispose(), в том примере Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
исключение выбрасывается где-то при открытии порта или вызова SomeMethod(), т.к. этот метод должен вернуть SerialPort вызывающему методу. И идея такая что если возникло исключение, то в Finally оно будет поймано и порт закрыт. Спрашивается, зачем это делать если сборщик мусора все равно потом вызовет Finalize() у этого порта? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 11:09 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
SeVa тынц там внизу под статьей есть правильное замечание :) Dispose should not throw exceptions. Fix Dispose! Dispose should not throw exceptions: http://msdn.microsoft.com/en-us/library/bb386039.aspx The work-around is insane! Если Dispose() выкидывает исключения, то и действительно надо не воркэраунды лепить, а править Dispose() ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 11:11 |
|
CA2000: Dispose objects before losing scope
|
|||
---|---|---|---|
#18+
stenfordSeVa тынц там внизу под статьей есть правильное замечание :) Dispose should not throw exceptions. Fix Dispose! Dispose should not throw exceptions: http://msdn.microsoft.com/en-us/library/bb386039.aspx The work-around is insane! Если Dispose() выкидывает исключения, то и действительно надо не воркэраунды лепить, а править Dispose() Те ты предлагаешь net переписать? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.05.2013, 11:14 |
|
|
start [/forum/topic.php?fid=20&msg=38252524&tid=1404718]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
155ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 254ms |
0 / 0 |