ObjectDisposedException未处理:安全句柄已在程序结束时关闭

本文关键字:结束 程序 未处理 安全 句柄 ObjectDisposedException | 更新日期: 2023-09-27 18:12:47

我有一个.NET 4 C#控制台应用程序。它从我们的IBMi中提取数据,并将其发送到我们的互联网SQL Server。它完美地工作,直到它结束,我得到以下错误:

System.ObjectDisposedException未处理消息=安全句柄具有已关闭Source=mscorlib ObjectName="StackTrace:在System.Runtime.InteropServices.SafeHandle.DangerousRelease((在System.Threading.RegisteredWaitHandleSafe.Finilize((内部异常:

我的程序代码是:

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: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;
}

所有的方法都与此方法类似。

ObjectDisposedException未处理:安全句柄已在程序结束时关闭

在使用iDB2Connection系列数据库访问方法时,通过谷歌搜索可以发现一些关于相同错误的零散报告。显然,IBM依赖于.Net 1.1对EventHandles的处理,根据这篇Connect文章,EventHandles在迁移到.Net 2.0时发生了变化。

似乎唯一的缓解措施是更新到最新版本的IBM驱动程序(如您所注意到的,使用S21917 service pack for 5.3或SI37892 for 5.4(。


您是否在SafeWaitHandle上呼叫Close()以获得WaitHandle

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

来自MSDN:

当您为SafeWaitHandle属性分配一个新值时,在收集上一个SafeWaitHandle对象时,上一个句柄将被关闭。不要手动关闭句柄,因为当SafeWaitHandle尝试关闭句柄时,这会导致ObjectDisposedException。

您的任何类型都是一次性的吗?在退出应用程序之前,请尝试处理所有可支配资源。

我有同样的情况。问题是SafeHandle.ReleaseHandle中的P/Invoke调用起了一些作用,并调用了System.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success),后者试图在SafeHandle被处理后对其进行处理。

这不是您自己的SafeHandle实现,不是吗?否则,您可以尝试扩展CriticalHandle

相关文章: