Microsoft Windows APIコードパックを使用するC#アプリケーションがあります。特に、シェルデバイスの拡張機能を使用しています。除去。Windows APIコードパックを使用するC#アプリケーションシェル拡張機能はシャットダウンしません
しかし、Visual C#2010(Express)でアプリケーションを終了しようとすると、デバッガを手動で停止する必要があります。 ShellObjectWatcherを手動で破棄しても、Win APIコードパックにバックグラウンドループが存在しているように見えます。私がそれを殺すことができる唯一の方法は、デバッガを手動で停止することです。
アプリはWPFで構築されています。
最終的に、VisC#2010は、デバッガの下でアプリケーションを実行しようとすることをやめます。デバッグを開始するように指示しますが、デバッグは開始しません。もう一度やり直すには、タスクマネージャを使用してアプリケーションを終了し、その後VC#2010をシャットダウンするだけです。コーヒーを持ってから、もう一度起動してください。奇妙な私は隠されたプロセスやウィンドウがハングアップしていると思われますが、アプリケーションをクリーンアップしようとするとシャットダウンされません。
どのように私はこのShellObjectWatcherをもう少し効果的にクリーンアップすることができますか?
"ShellObjectWatcher"クラスはありません、どのバージョンですか?シェルインターフェイスは常にCOMスレッドアフィニティを持っていますが、WPFまたはWinformsアプリケーションの[STAThread]からのみ使用してください。そうしないと、COMはオブジェクトをスレッドセーフなホームにするためにスレッドを開始します。 –
Windows APIコードパック1.1の一部 コードパック内のmessaglistenerスレッドメソッドにぶら下がっているようです。 – Mark
私もこれに遭遇しました。具体的には、MessageListener.ThreadMethod()はwhile(_running)の中でブロッキング呼び出しを持つため、Dispose()が_runningを設定してスレッドを終了しようとすると応答しません。どちらが当然ですか。したがって、これらのMessageListenerスレッドは決してクリーンアップされません。これは、バックグラウンドスレッドであれば問題ありませんが、そうではありません。 MSFT独自のShellObjectWatcherSampleWPFで同じ動作が確認できます。 – MNGwinn