ObjectDisposedException өңделмеген: Қауіпсіз тұтқа бағдарлама соңында жабылды

Менде .NET 4 C# консольдық қосымшасы бар. Ол біздің IBM i деректерін шығарып, оны біздің Интернеттегі SQL Server серверіне жібереді. Ол аяқталғанға дейін мінсіз жұмыс істейді, келесі қатені аламын:

System.ObjectDisposedException өңделмеген Message = Safe handle бар   жабық Source = mscorlib ObjectName = «» StackTrace:          at System.Runtime.InteropServices.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());
    }
}

Консольде бастау уақытын және аяқталу уақытын көремін. Мен соңғы сызықтың орындалуын білемін. Мен ұмытып кетуімді не істеуім керек?

Update: The Sync* methods pull data from the IBM into an object then uses entity framework to insert the records into the database.

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

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

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

public IEnumerable 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
Мен WaitHandle деген не екенін білмеймін, сондықтан мен оны жанама түрде қолданамын.
қосылды автор Mike Wills, көзі
Sync * қоңырау отбасы не істейді? Бұл кодты көре аламыз ба? Мен WaitHandle-ны ағып кететініне келісемін.
қосылды автор user7116, көзі
Мен оны IBM драйверлеріне қадағалап отырдым, мен бұл жайтты және ықтимал түзетуді көрсету үшін жауапты жаңарттым.
қосылды автор user7116, көзі

3 жауаптар

Googling iDB2Connection қолданған кезде бірдей қателіктің кейбір шашыраңқы есептерін көрсетеді дерекқорға қол жеткізу әдісі. IBM корпорациясы 1.1 нұсқасына негізделген EventHandles-ді басқаруға негізделген. Net 2.0 осы қосылуға арналған мақалаға .

IBM драйверлерінің ең соңғы нұсқасына жаңартуды жалғыз тоқтату керек (S21917 5.3 немесе SI37892 үшін қызмет пакетін пайдаланып, ескертетін болсаңыз).


WaitHandle үшін SafeWaitHandle жүйесінде Close() деп аталады ма?

WaitHandle wh = ...;

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

From MSDN:

SafeWaitHandle сипатына жаңа мән тағайындағанда, алдыңғы SafeWaitHandle нысаны жиналғанда, алдыңғы ұстау жабылады. Қолтаңбаны қолмен жаппаңыз, себебі SafeWaitHandle дескриптті жабуға әрекет жасаған кезде ObjectDisposedException нәтижесін береді.

7
қосылды
Жарайды ... Клиентке қол жеткізу үшін 5,4 емес, 5,3. Мен ең соңғы патчты қотарып аламын. Менің ойымша, бұл тезірек iSeries Access-тың соңғы нұсқасына тезірек итермелейді. PITA дегеніміз не? БАРЛЫҚ жобалар бірден жаңартылуы керек, себебі сізде бір уақытта орнатылған драйвердің бірнеше нұсқасы болмайды.
қосылды автор Mike Wills, көзі
Менің iSeries Access V5R4 құрылғыма SI37892 жұмыс істеген сияқты көрінеді. Күлкілі, мен соңғы нұсқасында болдым деп ойладым.
қосылды автор Mike Wills, көзі
@ordag: шын мәнінде ObjectDisposedException кодтан тасталады, әдетте, басқа ағынға, ол оқиға иығына сүйенеді!
қосылды автор user7116, көзі
Woah, бұл жаман іске. ObjectDisposedException нәтижесіне әкелетін Dispose әдісін шақыру ?!
қосылды автор ordag, көзі

Сіздің кез-келген түрлері Біржолғы болады ма? Қолданбадан шықпай тұрып бір рет пайдаланылатын ресурстарыңыздың барлығын жойып көріңіз.

2
қосылды
Бұл менің жарияланғаннан кейінгі алғашқы ойым болды. Мен кодтың бірде-біреуі IDisposable екеніне көз жеткіздім. Бұл көмектесті. Мен енді кез келген нысанның .Диспозиция() енгізілгеніне сенімдімін.
қосылды автор Mike Wills, көзі
Жоғарыда айтқанымдай, «WaitHandle» дегеннің не екенін білмеймін, сондықтан мен оны жанама түрде қолданамын
қосылды автор Mike Wills, көзі
@MikeWills: IDisposable қосу SafeHandle қолданысын сиқырлы түрде түзетеді. SafeHandle немесе оның алынған сабақтарын пайдалану үшін кодты қарауыңыз керек. WaitHandle-ге қатысты кейбір кодтар кінәлі.
қосылды автор user7116, көзі

I have an equal situation. The problem there is that a P/Invoke call in SafeHandle.ReleaseHandle does some magic and calls System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success), which tries to do something with the SafeHandle after it was disposed.

Бұл сіздің жеке SafeHandle енгізуіңіз емес пе? Әйтпесе орнына CriticalHandle кеңейтімін көріңіз.

0
қосылды
Жоқ, мен мұндай нәрсе жасадым. Бұл белгілі қате ме? Егер бар болса, онда жұмыс бар ма? Мен осы өмірді жүзеге асыру кезінде қиындықтар туғызатын едім.
қосылды автор Mike Wills, көзі
Менде қате бар (әрине әртүрлі бағдарлама). Бірақ оны қайта қарап шыққаннан кейін мен дұрыс емес деп ойлаймын. Жоғарыдағы түзетуімді қараңыз.
қосылды автор ordag, көзі