我有一個.NET 4 C#控制檯應用程序。它從IBM i中提取數據並將其發送到我們的Internet SQL Server。它完美的作品,直到它結束,我得到以下錯誤:ObjectDisposedException未處理:程序結束時已關閉安全句柄
System.ObjectDisposedException was unhandled Message=Safe handle has been closed Source=mscorlib ObjectName="" StackTrace: at System.Runtime.InteropServices.SafeHandle.DangerousRelease() at 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;
}
所有的方法都與此類似。
什麼的'同步*'家庭電話的呢?我們可以看到這些代碼嗎?我敢打賭它漏了一個WaitHandle。 – user7116
我不知道'WaitHandle'是什麼,所以我可能只是間接使用它。 –
我已經將它跟蹤到IBM的驅動程序,我已經更新了我的答案以反映此問題以及可能的解決方法。 – user7116