Я тут поспорил с одним специалистом по поводу уничтожения (Dispose) объектов DBObject, которые созданы в моем коде с ноля и приписаны к транзакции (AddNewlyCreatedDBObject). Понятно, что если объект не будет уничтожен ни мной, ни транзакцией, то за него возьмется сборщик мусора из другого потока и может положить AutoCAD на лопатки. Я пока нигде такие объекты не уничтожаю, как и полученные из tr.GetObject. И вроде работает. Не без глюков, конечно. Но вот при отладке одного из клонов AutoCAD, я заметил в окне отладчика "Forgot to call Dispose?: DisposableWrapper". Это явно было про мой новый объект после диспоза транзакции. И я призадумался...
Вот тут
help.autodesk.com/view/OARX/2021/ENU/?guid=GUID-9DFB5767-F8D6-4A88-87D6-9676C0189369 написано, что такие объекты надо непременно принудительно уничтожить. А вот тут
www.keanw.com/2008/06/cleaning-up-aft.html Киан пишет прямо противоположное - как старые, так и новые объекты транзакция уничтожит сама. Правда Киан писал давно, может все изменилось. Но и официальной документации доверия тоже нет.
Если все-таки уничтожать - то как? Если объявить через using, то до tr.Commit объект в большинстве случаев недоживет (только в каких-то очень простых методах может дожить) и транзакция будет пытаться записать в базу данных удаленный объект... фатально? Если не использовать using, то надо писать что-то вроде
using (Transaction tr = db.TransactionManager.StartTransaction())
{
....
tr.AddNewlyCreatedDBObject(newEntity, true); // где-то глубоко в циклах или вообще в другом методе с передачей tr в параметрах
....
tr.Commit();
foreach (DBObject obj in tr.GetAllObjects())
if (!obj.IsDisposed)
obj.Dispose(); // то есть по идее удалять надо после комита, но до уничтожения самой транзакции
}
и так при каждом методе, где используется транзакция... дурдом? Зачем тогда вообще транзакции, если за ними все равно чистить надо.
Я проверил - GetAllObjects после Commit по прежнему выдает все объекты и они все еще не уничтоженные. Но там не только новые объекты, там все что я открывал и даже еще много чего, что открылось как-то косвенно. Лишний код, лишнее время... Или не лишнее...