1

デバッグ中に WPF アプリケーションが正常に終了しない理由を突き止めようとしています。「きれいに」とは、すべてのウィンドウが閉じていることを意味します。アプリが終了したことを示すさまざまなメッセージが [出力] ウィンドウに表示されますが、プロセスはまだアクティブであり、デバッガーの [停止] ボタンはまだアクティブです。

メソッドを呼び出しましたShutdown()が、何かがアプリケーションの終了を妨げています。IOデバイスへのイーサネット接続に関係があると確信していますが、何が間違っているのかわかりません。(デバイスを接続するための呼び出しをコメントアウトすると、アプリは正常に終了できます)

VSE 2010 がすべてのアクティブなスレッドを一覧表示できるかどうか疑問に思っていました。これにより、メイン プログラムの終了後も何が「生きている」かについての手がかりが得られる可能性があります。または、ここで役立つ外部ツールはありますか?

4

2 に答える 2

3

Visual StudioThreadsウィンドウを使用して、まだアクティブなスレッドを確認できるはずです。このウィンドウが Express エディションで使用できるかどうかは完全にはわかりませんが (ドキュメントにはそのような制限については記載されていません)、使用できない場合は、WinDbg を使用してすべてのスレッドを一覧表示することもできます。WinDbg は、Windows 用のデバッグ ツールの一部です。入手するには、最新バージョンの Windows SDK をインストールする必要がある場合があります。

于 2013-01-22T12:26:08.327 に答える
3

Use the debugger first. Debug + Break All, Debug + Windows + Threads to see what threads are still running. You can double-click one and use Debug + Windows + Call Stack to see what it is doing. The typical case is a thread you started but forgot to tell to terminate. The Thread.IsBackground property is a way to let the CLR abort a thread automatically for you.

Technically it is possible to have a problem with a device that prevents a process from shutting down. The Threads window would then typically show only one thread with an otherwise impenetrable stack trace. If you use Task Manager, Processes tab, View + Select Columns, tick Handles, then you may see only one handle still in use. The diagnostic then is that you have a lousy device driver on your machine that doesn't properly support I/O cancellation. Which could leave a kernel thread running that doesn't quit, preventing the process from terminating. Very unusual, look for the reasons given in the first paragraph first.

于 2013-01-22T12:43:25.987 に答える