Страница: 1 |
Страница: 1 |
Вопрос: Освобождение ресурса
Добавлено: 17.10.06 17:54
Автор вопроса: Neco | Web-сайт:
Ощущение, что Dispose не работает.
Вот таким кодом:
Try
Dim conn As New OleDb.OleDbConnection
Dim comm As New OleDb.OleDbCommand
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + """" + m_src_dir + """" + ";Extended Properties=dBASE IV;"
comm.Connection = conn
comm.CommandType = CommandType.Text
conn.Open()
Dim dt As Data.DataTable
Dim adap As New OleDb.OleDbDataAdapter(comm)
m_DataSet = New DataSet
FillDBFArr()
Dim i As Integer
For i = 0 To dbf.Length - 1
dt = New DataTable
m_DataSet.Tables.Add(dt)
comm.CommandText = "select * from " + dbf(i).table_name
adap.Fill(dt)
CopyDataTableToTypeArray(dt, dbf(i))
Next
conn.Close()
conn.Dispose()
adap.Dispose()
comm.Dispose()
Catch ex As Exception
Throw ex
End Try
End Sub
Загружаю dbf таблицы. Теперь хочу удалить папку их содержащую - сами таблицы удаляются - а папка нет. Делал в цикле GC.Collect с параметрами и без - не помогает. Удаляется только после завершения приложения.
Как заставить OleDB отстать от папки?
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
Arseny
ICQ: 298826769
Вопросов: 53
Ответов: 1732
Профиль | | #1
Добавлено: 18.10.06 09:51
Вопрос в содержании. Удали Папку, на крайняк перегрузись.
Номер ответа: 2
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #2
Добавлено: 18.10.06 13:07
Если бы ты ещё то, что ДО вопроса прочитал - было бы совсем замечательно.
Номер ответа: 3
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #3
Добавлено: 18.10.06 15:10
Не уверен, что поможет (у тебя .NET, так что не знаю), но стоит попробовать:
Dim conn As OleDb.OleDbConnection
Dim comm As OleDb.OleDbCommand
..
..
Set conn = New OleDb.OleDbConnection
Set comm = New OleDb.OleDbCommand
..
..
Set conn = Nothing
Set comm = Nothing
То же самое по работе с adap
Номер ответа: 4
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #4
Добавлено: 19.10.06 21:49
Нет, в дотнете это бесполезно.
Придётся удалять временную папку при следующем запуске.
Номер ответа: 5
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #5
Добавлено: 20.10.06 00:17
Небольшие выдержки из Рихтера.
Для метода Finalize.
ний и про вызов метода Finalize базового типа.
// Это поле содержит Win32-описатель неуправляемого ресурса.
private IntPtr handle;
// Этот конструктор инициализирует описатель.
public OSHandle(IntPtr handle) {
this. handle = handle;
// При сборе мусора вызывается метод-деструктор (Finalize),
.// закрывающий описатель неуправляемого ресурса.
~OSHandleQ {
CloseHandle(handle);
}
// Открытый метод возвращает значение описателя ресурса с оболочкой.
public IntPtr ToHandleO { return handle; }
// Открытый оператор неявного приведения возвращает
// значение описателя ресурса с оболочкой.
public static implicit operator IntPtr{OSHandle osHandle} {
return osHandle. ToHandle();
[B]// Вызывается закрытый метод, чтобы освободить неуправляемый ресурс.
[System. Runtime. InteropServices.DLLlImport("Kernel32"]
private extern static Boolean CloseHandle(IntPtr handle);[/B].
ки модели освобождения ресурсов требуется много кода, а этот класс — всего лишь
оболочка неуправляемого ресурса. Но есть и хорошая новость: скорее всего вам
не понадобится ничего, кроме этого класса. Иначе говоря, если вы создаете тип-
оболочку для неуправляемого ресурса, можно просто взять код OSHandle и скопи-
ровать его прямо в собственный проект как есть. Было бы действительно з;юро-
во, если бы в Microsoft сами включили этот класс в FCL,
А вот для Dispose.
// Реализация интерфейса IDisposable сигнализирует пользователям
// этого класса о том, что у него есть модель освобождения ресурсов.
public sealed class OSHandle : IDisposable {
// Это поле хранит И1п32-описатель неуправляемого ресурса.
private IntPtr handle;
// Этот конструктор инициализирует описатель.
public OSHandle(IntPtr handle) {
this. handle = handle;
// При сборе мусора вызывается этот метод Finalize,
// чтобы закрыть описатель неуправляемого ресурса.
"OSHandleO {
Dispose(false);
!
// Вызов этого открытого метода позволяет детерминирование
// закрыть описатель неуправляемого ресурса.
public void Dispose() {
// Поскольку очистка объекта выполняется явно,
// запретить сборщику мусора вызов метода Finalize.
GC. SuppressFinalize(this);
// Вызвать метод, реально выполняющий очистку.
Dispose(true);
}
// Этот открытый метод можно вызвать вместо Dispose.
public void Close() {
Dispose();
}
// Общий метод, реально выполняющий очистку.
// Его вызывают методы Finalize, Dispose и Close.
// Поскольку это изолированный класс, метод является закрытым.
// Если бы класс не был изолированным, метод был бы защищенным.
private void Dispose(Boolean disposing) {
// Синхронизировать потоки при одновременном вызове Dispose/Close
lock (this) {
if (disposing) {
// Объект уничтожается или закрывается явно, поэтому
// завершение объекта не выполняется, следовательно,
// в этом условном операторе обращение к полям, ссылающимся
// на другие объекты, безопасно для кода, так как для
// этих объектов метод Finalize еще не вызван.
// В случае OSHandle здесь делать нечего.
}
// Выполняется уничтожение/закрытие.
if (IsValid) {
// Если описатель действительный, закрыть неуправляемый ресурс.
// ПРИМЕЧАНИЕ: Замените CloseHandle любой функцией, необходимой,
// чтобы закрыть или освободить неуправляемый ресурс.
CloseHandle(handle);
// Занести в поле описателя недействительное значение, чтобы
// CloseHandle нельзя было вызвать дважды.
handle = InvalidHandle;
}
}
}
// Открытое свойство, возвращающее значение недействительного описателя.
// ПРИМЕЧАНИЕ: Сделайте так, чтобы это свойство возвращало недействительное
// значение для любого неуправляемого ресурса, который вы используете,
public IntPtr InvalidHandle { get { return IntPtr.Zero; } }
// Открытый метод, возвращающий значение описателя в оболочке.
public IntPtr ToHandleO { return handle; }
// Открытый оператор неявного приведения
// возвращает значение описателя в оболочке.
public static implicit operator :ntPtr(OSHandle osHandle) {
return osHandle.ToHandle();
}
// Открытые свойства, показывающие, действителен ли описатель в оболочке,
public Boolean IsValid { get { return (handle != InvalidHandle); } }
public Boolean Islnvalid { get { return !IsValid; } )
[B]// Закрытый метод, вызываемый для освобождения неуправляемого ресурса,
[System.Runtime.InteropServices.DllImport("Кегпеl32"]
private extern static Boolean CloseHandle(IntPtr handle);[/B]}