【发布时间】:2011-10-27 14:50:19
【问题描述】:
我有一个 .NET 4 C# 控制台应用程序。它从我们的 IBM i 中提取数据并将其发送到我们的互联网 SQL Server。它工作完美,直到结束,我收到以下错误:
System.ObjectDisposedException 未处理 Message=安全句柄有 已关闭 Source=mscorlib ObjectName="" StackTrace: 在 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());
}
}
在控制台中,我看到了开始时间和结束时间。所以我知道最后一行确实被执行了。我忘记或不做我应该做的事情是什么?
更新: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;
}
所有方法的操作都与此类似。
【问题讨论】:
-
Sync*系列调用有什么作用?我们能看到那个代码吗?我敢打赌它会泄露一个 WaitHandle。 -
我不知道
WaitHandle是什么,所以我可能只是间接使用它。 -
我已经追踪到 IBM 驱动程序,我已经更新了我的答案以反映这一点和可能的修复。
标签: c# .net-4.0 console-application objectdisposedexception