3

.NET 4 C# コンソール アプリケーションがあります。IBM i からデータを取得し、インターネット SQL Server に送信します。終了するまで完璧に動作しますが、次のエラーが発生します。

System.ObjectDisposedException は処理されませんでした メッセージ = 安全なハンドルが閉じられました 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;
}

すべてのメソッドは、これと同様に機能します。

4

3 に答える 3

7

少しグーグルで調べてみると、iDB2Connection ファミリのデータベース アクセス メソッドを使用した場合に、同じエラーがいくつか散在するレポートが明らかになりました。明らかに IBM は、.Net 1.1 の EventHandles の処理に依存していますが、この Connect の記事によると、.Net 2.0 への移行で変更されました。

唯一の猶予は、IBMドライバーの最新バージョンに更新することです(5.3にはS21917サービスパック、5.4にはSI37892を使用)。


に電話Close()してSafeWaitHandleWaitHandleますか?

WaitHandle wh = ...;

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

MSDN から:

SafeWaitHandle プロパティに新しい値を割り当てると、以前のハンドルは、以前の SafeWaitHandle オブジェクトが収集されたときに閉じられます。SafeWaitHandle がハンドルを閉じようとしたときに ObjectDisposedException が発生するため、手動でハンドルを閉じないでください。

于 2011-10-27T15:10:46.503 に答える
2

あなたのタイプは使い捨てですか?アプリケーションを終了する前に、使い捨てのリソースをすべて破棄してみてください。

于 2011-10-27T14:53:49.800 に答える
0

私は同じ状況にあります。そこにある問題は、P/Invoke呼び出しSafeHandle.ReleaseHandleが何らかの魔法を実行し、それが破棄された後にSystem.Runtime.InteropServices.SafeHandle.DangerousAddRef(Boolean& success)何かをしようとする呼び出しを行うことです。SafeHandle

それはあなた自身のSafeHandle実装ではありませんか?それ以外の場合は、代わりに拡張を試みることができますCriticalHandle

于 2011-10-27T15:02:17.207 に答える