5


0

スレッドの出所を判別する

私が開発した小さなアプリケーションで、私が開発したアプリケーション用に作成したコンポーネントをテストするために、高いちらつきとUIの遅れが発生しています。 ちらつきと遅れはアイドル時間の間(真剣に - 何も起こってはいけないとき)に起こっていたので、私は調査をすることにしました。 Threadsウィンドウでいくつかのスレッドに気付いていないことに気付いた(まったく予想外のことではない)が、私の注意を引いたのは「最も高い」優先順位に設定されたスレッドです。 このスレッドは私のコードが実行される前であっても `Main()`が呼ばれた時点で存在します。 私は、このスレッドが、私が書いたすべての.NETアプリケーション、さらにはコンソールアプリケーションにも存在するように見えることを発見しました。

私は大胆な魂なので、スレッドを凍結して何が起こったのかを確認することにしました。 ちらつきは実際には止まりましたが、データベースとのやり取りに関してはちょっと変わったことを経験しました(私はSQL CE 3.5 SP1を使用しています)。 これはデータベースが実際に実行されているスレッドかもしれないと思いましたが、アプリケーションのロード時(DBへの参照前)に開始され、他の非データベースアプリケーションに存在することを考えると、そうではないと信じること。

一時停止中にデバッガで切り替えた場合、このスレッドは(他のいくつかと同様に)Location列にデータがなく、Call Stackも表示されないため、GetCurrentProcess()を使用してStartAddressプロパティを照合してみました。しかし、現在ロードされているすべてのモジュールのアドレス範囲を超えています。

このスレッドが何であるか、または私がどのように見つけることができるかについて誰かに何か考えがありますか?

編集

掘り下げた後、StartAddressはkernel32.dllにあるように見えます(近くのメモリの内容に基づく)。 http://msdn.microsoft.com/en-us/library/system.diagnostics.processthread.startaddress.aspx [このページ]によると、これは私がこれがスレッドを開始するために使用される単なる標準的なシステム関数であると私に考えさせる。これは基本的に、このスレッドが実際にどこから来たのかを判断する限り、私を正方形に戻します。 これは、このリストのすべてのスレッドがStartAddressに対して同じ値を持っているという事実によってさらに確認されます。

*編集2 *

Process Explorerは、実際に意味のある開始アドレスを教えてくれました。 mscorwks.dll!CreateApplicationContext 0xbbefのようです。 このdllは%WINDOWS%\ Microsoft.NET \ Framework \ v2.0.50にあるため、明らかにランタイムアセンブリのようです。 なぜかよくわからない

  • 最優先です

  • それは私のアプリケーションでしゃっくりを引き起こしているようです

3 Answer


6


あなたはhttp://technet.microsoft.com/en-us/sysinternals/default.aspx[Sysinternals]を使用して試すことができます。 Process Explorerでは、かなり深く掘り下げましょう。 プロセスを右クリックしてプロパティにアクセスします。 それから「スレッド」タブ。 そこには、スレッドのスタックとモジュールがあります。

編集:

https://stackoverflow.com/questions/830822 [タスク]の後に、あなたの "最高の"優先順位のスレッドはガベージコレクションのために実行される `Finalizer`スレッドであるようです。 私はまだそれが絶えず走り続ける理由について正当な理由がありません。 たぶんあなたはあなたのプロセスの中で起こっているなんらかのファンキーなオブジェクト寿命のふるまいを持っていますか?


2


これが何であるかはわかりませんが、アンマネージドデバッグを有効にして、 Windowsシンボルサーバーを使用してVisual Studioをセットアップすると、さらにいくつかの問題が発生する可能性があります。手がかり。


0


ガベージコレクタのスレッドかもしれません。 ファイナライザ関連のバグを一度調査していたときにも気づきました。 おそらくあなたのシステムメモリは少なく、GCは常に収集しようとしていますか? これも前述のバグの場合です。 私は自分のマシンでそれを再現することはできませんでしたが、私の同僚は時計仕掛けのように再び現れるRAMの少ないマシンを持っていました。