Re[12]: BLToolKit и многопоточность
От: FixBo  
Дата: 04.10.06 04:19
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Замечательно. Теперь представим себе, что у нас есть класс, одно из полей которого тот самый хендл файла, который нужно освобождать.

БП>Этот класс в свою очередь является полем другого класса, к примеру, класса DbConnection. Если не dispose'ить DbConnection, то кто и когда освободит unmanaged ресурсы, используемые внутри класса, который внутри DbConnection?

Его Finalize. Написание деструкторов обязательно при использовании unmanaged ресурсов (кстати IDisposable при этом совсем необязательно имплементить).

Dispose придумали просто для более раннего освобождения ресурсов, у Finalize другая задача.
Re[13]: BLToolKit и многопоточность
От: Блудов Павел Россия  
Дата: 04.10.06 04:37
Оценка:
Здравствуйте, FixBo, Вы писали:

FB>Dispose придумали просто для более раннего освобождения ресурсов, у Finalize другая задача.

Кажется, я понял о чём идёт речь. Присоединяюсь к этому
Автор: IT
Дата: 04.10.06
.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[9]: BLToolKit и многопоточность
От: Блудов Павел Россия  
Дата: 04.10.06 08:14
Оценка:
Здравствуйте, FixBo, Вы писали:

FB>Такой что при disposing == false вообще ничего делать не надо. Сомневаюсь что в BLT найдется хоть один класс использующий unmanaged ресурсы...


done.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[10]: BLToolKit и многопоточность
От: vdimas Россия  
Дата: 11.10.06 16:55
Оценка:
Здравствуйте, IT, Вы писали:


FB>>Такой что при disposing == false вообще ничего делать не надо. Сомневаюсь что в BLT найдется хоть один класс использующий unmanaged ресурсы...


IT>DbConnection как раз один из таких.


DbConnection сам позаботится о своих unmanaged ресурсах в собственном финализаторе. Т.е. в твоем классе ничего из финализатора делать не надо.
Re[11]: BLToolKit и многопоточность
От: IT Россия linq2db.com
Дата: 11.10.06 17:04
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>DbConnection сам позаботится о своих unmanaged ресурсах в собственном финализаторе. Т.е. в твоем классе ничего из финализатора делать не надо.


Уже разобрались.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: BLToolKit и многопоточность
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 29.04.09 06:05
Оценка:
Здравствуйте, IT, Вы писали:

B>>Подскажите как правильно организовать многопоточную работу приложения с БД, использующего BlToolKit.


IT>Прежде всего проверить не кешировать самому открытые соединения к базе. Т.е. DbManager должен создаваться при каждом запросе и в конце диспозиться. Создавать и сохранять его на будущее нельзя.


а если я напрямую DbManager не создаю, а конфигурирую через web.config и использую через DataAccessor, типа

public abstract class WorkerAccessor : DataAccessor<Worker>
    {
        [SqlQuery("SELECT * FROM CC_WORKERS WHERE USER_ID = :tabno")]
        public abstract Worker GetWorker(int tabno);


это условие автоматически выполняется?
Re[3]: BLToolKit и многопоточность
От: ili Россия  
Дата: 29.04.09 08:11
Оценка: 28 (1)
Здравствуйте, Odi$$ey, Вы писали:

IT>>Прежде всего проверить не кешировать самому открытые соединения к базе. Т.е. DbManager должен создаваться при каждом запросе и в конце диспозиться. Создавать и сохранять его на будущее нельзя.


OE>а если я напрямую DbManager не создаю, а конфигурирую через web.config и использую через DataAccessor, типа


OE>
OE>public abstract class WorkerAccessor : DataAccessor<Worker>
OE>    {
OE>        [SqlQuery("SELECT * FROM CC_WORKERS WHERE USER_ID = :tabno")]
OE>        public abstract Worker GetWorker(int tabno);
OE>


OE>это условие автоматически выполняется?


да.
если быть точным, то сгенерированый метод выглядит примерно так:


public Worker GetWorker(int tabno)
{
    DbManager db = GetDbManager();
    
    try
    {
       // тут всякие рутины с параметрами и экзекьютами.
    }
    finally
    {
        if (DisposeDbManager)
            db.Dispose();
    }
}


важно тут то, что выделено жирным.
GetDbManager() — возвращает либо новый экземпляр DbManager, либо тот что был передан (если был) в метод CreateInstance(DbManager db).
поле DisposeDbManager == true если в CreateInstance() не передавался DbManager иначе — false.

иначе говоря, если вы делаете так:
DataAccessor.CreateInstance<WorkerAccessor>().GetWorker(122); //то для таких методов для каждого вызова создается и диспозится DbManager

а вот если вы делаете так:
DbManager db = new DbManager();

//...
DataAccessor.CreateInstance<WorkerAccessor>(db).GetWorker(122); //то здесь используется созданный вами экземпляр менеджера, и за его диспоуз отвечаете уже вы
//..


есть еще такой метод создания:
DataAccessor.CreateInstance<T>(DbManager db, bool dispose);

он позволяет явно задать диспозить ли в методе DbManager (хотя, я голову за это не дам, точно не уверен, но вроде так )

P.S. вообще в вики это есть... вот только вики опять is dead
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.