私たちがサポートしている古いプロジェクトがあり、マルチスレッドの可能性が最も高い問題があります。 問題のあるセクションを実行する前に、元の実装者がThread.sleep
を実行して「修正」しました。 回避策は機能しますが、セクションがループ内にあるため、thread.sleep
はセクションが終了するまでに複数の時間を追加します。アプリケーションを強制的にシングルスレッドとして実行する方法はありますか?
私たちは睡眠の値を低くして実験してきましたが、根本的な原因を見つけたいと思います。私たちの調査中に私たちは私たちが助けてくれると思ったところで私物のものにlock
をやっていました。 追加のスレッドを生成する可能性のあるものを探しました。 いいえThread.startは使用せず、ThreadPoolを使用しません。 私たちを混乱させているのは、デバッグ中にメインスレッドが、誰がそれらを生成したか分からない約8つの他のスレッドの真ん中にあることです。 これはバックグラウンドスレッドなので、私が最初に考えたのはスレッドプールだと思っていましたが、コード内でそれについて言及しなかったので、
.net 2.0なのでAsync
sです。 これは大きなアプリケーションの一部ですので、Windowsサービスですが、簡単にデバッグできるようにCMDとして実行します。メインアプリケーション自体はWindowsフォームデスクトップアプリケーションです。 また、COM +コンポーネントが使用されている場合は、そのコンポーネントも使用されます。
の代わりに[STA]
を試しました。 また前述のようにロックします。 MemoryBarrier
も同様である。
問題は引き続き発生します。
この問題は、基本的にデータセットが破損していて、オブジェクトが存在してはいけないオブジェクトではnullです。 25-100回の繰り返しごとに1回発生するので、複製は簡単ではありませんが、この問題を再現しようとするテストを考案しました。
スレッドの問題の方向を私たちに指摘しています。
元の質問に戻る - これらの追加スレッドを作成することによって、誰がこのスレッドを作成できないようにすることができますか?
赤でマークされたスレッドに注意してください - これらは、バックグラウンドスレッドであり、限り、我々は、コードでそれらの言及を見ることができないよう。
スクリーンショットの疑わしいスレッドが、dataset
の列をアクティブに変更しています。問題は - スレッドが実行している関数SetColValueOnRow
を呼び出すメソッドは典型的なものであり、どのような種類のスレッドも使用しません。
このアプリケーションのCPUの親和性は1つのコア[元-周りの仕事の一部]
おかげ
編集に設定されています:データベースがOracle 12cのですが、私たちが直面している問題はに書き込む前に起こりますデータベース。 通常、データセットで発生するのは、テストの繰り返し回数が1回になるとレコード全体またはその列のいくつかが1回拭き取れることです。
どのタイプのアプリケーション(winforms、service、...) – pm100
これは大きなアプリケーションの一部なので、Windowsサービスですが、簡単にデバッグできるようにCMDとして実行します メインアプリケーション自体Windowsフォームデスクトップアプリケーションです。 – AngelicCore
また、この問題を再現/デバッグする際には、この部分だけを実行し、残りのアプリケーションは実行しません。 – AngelicCore