Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Освобождение ресурса Добавлено: 17.10.06 17:54  

Автор вопроса:  Neco | Web-сайт: neco.pisem.net | ICQ: 247906854 
Ощущение, что Dispose не работает.

Вот таким кодом:
    Public Sub FillDataSet()
        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
Как заставить OleDB отстать от папки?

Вопрос в содержании. Удали Папку, на крайняк перегрузись.

Ответить

Номер ответа: 2
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #2
Добавлено: 18.10.06 13:07
Если бы ты ещё то, что ДО вопроса прочитал - было бы совсем замечательно.

Ответить

Номер ответа: 3
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: neco.pisem.net
 Профиль | | #4
Добавлено: 19.10.06 21:49
Нет, в дотнете это бесполезно. :(
Придётся удалять временную папку при следующем запуске.

Ответить

Номер ответа: 5
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #5
Добавлено: 20.10.06 00:17
Небольшие выдержки из Рихтера.

Для метода Finalize.

Создатели С# обнаружили, что многие разработчики неправильно программируют методы Finalize. В частности, забывают про обработку' исключе-
ний и про вызов метода Finalize базового типа.

public sealed class OSHandle {
// Это поле содержит 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 едва ли можно назвать тривиальным: как видите, для поддерж-
ки модели освобождения ресурсов требуется много кода, а этот класс — всего лишь
оболочка неуправляемого ресурса. Но есть и хорошая новость: скорее всего вам
не понадобится ничего, кроме этого класса. Иначе говоря, если вы создаете тип-
оболочку для неуправляемого ресурса, можно просто взять код OSHandle и скопи-
ровать его прямо в собственный проект как есть. Было бы действительно з;юро-
во, если бы в Microsoft сами включили этот класс в FCL,

А вот для Dispose.:)

using System;
// Реализация интерфейса 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]}

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам