Исключение ObjectDisposedException не обработано: безопасный дескриптор был закрыт в конце программы - PullRequest
3 голосов
/ 27 октября 2011

У меня консольное приложение .NET 4 C #.Он извлекает данные из нашего IBM i и отправляет их на наш интернет-сервер SQL.Он прекрасно работает, пока не закончится, я получаю следующую ошибку:

System.ObjectDisposedException не обработан. Сообщение = Безопасный дескриптор закрыт.SafeHandle.DangerousRelease () в System.Threading.RegisteredWaitHandleSafe.Finalize () InnerException:

Код моей программы:

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine("Begin: " + DateTime.Now.ToString());
        SystemCodeController sc = new SystemCodeController();
        sc.SyncSystemCodes();
        ParkingTicketController pt = new ParkingTicketController();
        pt.SyncParkingTickets();
        EmailHelper.SendSuccessEmail();
        System.Console.WriteLine("End: " + DateTime.Now.ToString());
    }
}

В консоли я вижу время начала ивремя окончанияТак что я знаю, что последняя строка исполняется.Что я забываю или не делаю так, как я должен быть?

Обновление : методы Sync * извлекают данные из IBM в объект, а затем используют каркас сущностей для вставки записей в базу данных.

public void SyncParkingTickets()
{
    ptr.ClearTable();
    ptr.InsertNewCitation(ibmI.GetAllCitations());
    ptr.SaveChanges();
}

public void InsertNewCitation(IEnumerable<ParkingTicket> citations)
{
    foreach (ParkingTicket citation in citations)
    {
        InsertNewCitation(citation);
    }
}

public void InsertNewCitation(ParkingTicket citation)
{
    db.AddToParkingTickets(citation);
}

public IEnumerable<ParkingTicket> GetAllCitations()
{
    SystemCodeRepository scr = new SystemCodeRepository();

    //  Create SQL statement

    DataTable dt = new DataTable();
    using (iDB2Connection conn = new iDB2Connection(_connString))
    {
        using (iDB2Command cmd = new iDB2Command(sb.ToString(), conn))
        {
            conn.Open();
            using (iDB2DataAdapter da = new iDB2DataAdapter(cmd)) { da.Fill(dt); }
            conn.Close();
        }
    }

    #region Fill object from DataTable
    var citations = from i in dt.AsEnumerable()
                    select new ParkingTicket
                    {
                        // Fill object
                    };
    #endregion

    return citations;
}

Все методы работают аналогично этому.

Ответы [ 3 ]

7 голосов
/ 27 октября 2011

Немного При поиске в Google обнаруживаются отдельные сообщения об одной и той же ошибке при использовании семейства методов доступа к базе данных iDB2Connection. Очевидно, что IBM полагается на .Net 1.1 обработку EventHandles, которая изменилась при переходе на .Net 2.0 в соответствии с этой статьей Connect .

Похоже, единственной отсрочкой является обновление до последней версии драйверов IBM (как вы заметили, с использованием пакета обновления S21917 для 5.3 или SI37892 для 5.4).


Вы звоните Close() на SafeWaitHandle для WaitHandle?

WaitHandle wh = ...;

wh.SafeWaitHandle.Close(); // will throw ObjectDisposedException

От MSDN :

Когда вы назначаете новое значение свойству SafeWaitHandle, предыдущий дескриптор будет закрыт, когда будет собран предыдущий объект SafeWaitHandle. Не закрывайте ручку вручную, потому что это приводит к исключению ObjectDisposedException, когда SafeWaitHandle пытается закрыть ручку.

2 голосов
/ 27 октября 2011

Есть ли у вас какие-либо типы Одноразовые ? Попробуйте утилизировать все имеющиеся ресурсы перед выходом из приложения.

0 голосов
/ 27 октября 2011

У меня равная ситуация.Проблема в том, что P/Invoke вызов в SafeHandle.ReleaseHandle совершает магию и вызывает System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success), который пытается что-то сделать с SafeHandle после его удаления.

Это не ваше SafeHandle реализация не так ли?В противном случае вы могли бы попытаться расширить CriticalHandle.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...