ObjectDisposedExceptionが処理されませんでした:プログラムの終了時にセーフハンドルが閉じられました

私は.NET 4 C#コンソールアプリケーションを持っています。 IBM iからデータを取り出し、インターネットSQL Serverに送信します。それが終了するまで、それは完璧に動作し、私は次のエラーが表示されます:

System.ObjectDisposedExceptionが未処理メッセージ= Safeハンドルに   クローズされました。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());
    }
}

コンソールでは、開始時刻と終了時刻が表示されます。だから私は最後の行が実行されることを知っている。私は何を忘れているのか、そうしていないのですか?

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 答え

iDB2Connectionを使用すると、同じエラーの散在したレポートがGoogleに表示されるデータベースアクセス方式のファミリーです。明らかに、IBMは.Net 2.0への移行の際に変更されたEventHandlesの.Net 1.1処理に頼っているようです。このConnectの記事をご覧ください。

唯一の執行猶予は、最新のバージョンのIBMドライバーにアップデートすることです(S21917サービスパック(5.3用)またはSI37892用5.4用)。


WaitHandleSafeWaitHandleClose()を呼び出していますか?

WaitHandle wh = ...;

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

From MSDN:

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

7
追加された
さて、私はクライアントアクセスのために5.4ではなく5.3を使用しています。私はとにかく最新のパッチをダウンロードしています。私はこれが、私たちを最新のバージョンのiSeries Accessにすばやく押し込めると感じています。ピタです。一度に複数のバージョンのドライバをインストールすることはできないため、すべてのプロジェクトを一度にアップグレードする必要があります。
追加された 著者 Mike Wills,
iSeries Access V5R4にアップグレードして、 SI37892 働いていたようだ。面白い、私は私が最新バージョンであると思った。
追加された 著者 Mike Wills,
@ordag:実際には、ObjectDisposedExceptionはコードからスローされています。通常、別のスレッドでは、破棄されたイベントハンドルに依存しています。
追加された 著者 user7116,
うわー、それは悪い実装だ。 Dispose メソッドを呼び出すと、 ObjectDisposedException になります。
追加された 著者 ordag,

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

2
追加された
それは投稿後の私の最初の考えでした。私のコードに IDisposable がないことを確認しました。それは役に立たなかった。私が触れるすべてのオブジェクトに .Dispose()が含まれていることを確認しています。
追加された 著者 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,