Ninject で DI 用にプロジェクトをリファクタリングする前に、単純なメソッドを持つ単純なテスト クラスがありました。
public void TestImport()
{
var functionality = new ImportFunctionality();
functionality.Execute();
}
この「アプリ」(私のライブラリを統合テストするための単なるサンドボックス WPF クライアント アプリ) を実行すると、「メイン」ウィンドウが表示され、このTestImport
メソッドと呼ばれるそのウィンドウのボタンをクリックすると、実行され、テストとデバッグが可能になりました。私のコード、そしてメインウィンドウが閉じられると、アプリはすぐに終了し、VSはデバッグモードを終了します. 通常のもの。
次に、全体をリファクタリングし、コード全体に Ninject、ファクトリ、インターフェイスを使用して依存性注入を実装しました。メソッドは次のようになりTestImport
ます。
public void TestImport()
{
using (var kernel = new StandardKernel())
{
kernel.Load<SecurityNinjectModule>();
kernel.Load<HelpersNinjectModule>();
kernel.Load<ImportFunctionalityNinjectModule>();
var functionality = kernel.Get<IImportFunctionality>();
functionality.Execute();
}
}
WPFサンドボックス/テストアプリを実行すると、すべてが機能し、「メイン」ウィンドウが閉じられ、アプリケーションが終了せず、Visual Studioがデバッグモードのままになることを除いて、それは素晴らしいことです. Dispose()
それを修正するために呼び出しを追加しましたが、うまくいきませんでした。ブロックでラップしてusing
も修正されません。
ボタンをクリックせずにサンドボックスを実行してTestImport
メソッドを実行し、メイン ウィンドウを閉じると、アプリは適切にシャットダウンします。
これにより、Ninject カーネル オブジェクトにたどり着きます。Dispose()
呼び出しにもかかわらず、何らかの形でリソースを保持している可能性はありますか? それでは、Ninject 3.0 を実行しているアプリケーションを適切にシャットダウンするにはどうすればよいでしょうか?
EDIT
デバッグ/ウィンドウ/スレッドウィンドウを表示すると、インスタンス化されたすべてのスレッドがスリープしているか、「スリープ中、待機中、または参加中」のいずれかが表示されます。という名前のスレッド.NET System Events
は、スリープ中、待機中、または参加中です。vshost.RunParkingWindow
メイン スレッドは「ネイティブ トランジションへの管理」と呼ばれるスレッドです。. 受け入れられれば答えはうまくいくようですが、@BahriGungorが言うように、「System.Environment.Exitを使用することは、出口標識に従いたくなかったため、ダイナマイトを使用してドアを作ることによく似ています」。そして、なぜこれが起こっているのかは述べていません。
興味深いことに、一貫して発生するわけではありません。コードを中断してステップ スルーすることがあり、「F5」キーを押して再開し、メイン ウィンドウを閉じると、適切にシャットダウンします。どうしたの?
EDIT 2
機能により が表示され、FileDialog
そのダイアログが Excel ワークブックのファイル名を返さない場合、インポート ウィンドウは表示されません。私はこれにそれを絞り込みました:
- インポート ビューが表示されている場合、メイン アプリ ウィンドウを閉じた後にどのように閉じても、VS はデバッグ モードを適切に終了します。
- インポート ビューが表示されない (つまり、
FileDialog
編集可能なものが返されない) 場合、VSはメイン アプリ ウィンドウを閉じた後、デバッグ モードを終了しません。