私たちのプロジェクトでは、数千の単体テストがあります。それらのいくつかは、より大規模なセットアップを必要とし、マルチスレッド/非同期パーツ、およびオブジェクトをセットアップするための単一性を使用する統合テストです。
これらの統合テストは通常、非常にスムーズに実行されますが、場合によっては、ソリューション内のすべてのテスト(〜2.5k)が実行されると、の非同期コンポーネントが何らかの理由でデッドロックに陥ったように見えます。(タイムアウトのためテストは中止されました)
コードを何時間も上下に検索しましたが、デッドロックが発生する理由を見つけることができませんでした。
ところで、スレッドの再同期を待つためにポーリングを使用します。
var foo = new SomethingThatIsModifiedByTheAsyncThreads();
this.SetupEverything();
this.AsyncComponentX.StartSomething(foo);
// wait for completion
while (foo.State != fooStates.AllDone)
{
Thread.Sleep(10);
}
// check output
Assert.IsTrue(this.CheckThatAllIsRight(foo));
これはそれを行うための最良の方法ではありませんが、これが問題であるとは思いません(他の考えですか?)。したがって、非同期のものは単に完了していないようで、設定されていませんfoo.StateをAllDoneに設定します。しかし、どうしてそれができるのでしょうか?多数のテストを(デバッグではなく)実行した場合にのみこれが発生するのはなぜですか?MSTestは、スレッドを実行させずに、スレッド(4つあります)で何かを台無しにしているのではないかと思います。(ところで、非同期のものは、それぞれ単一のワーカー/メッセージコンシューマースレッドを持つメッセージキューとして機能する特別な非同期モジュールとして実行されます。しかし、これらのクラスは試されて真であるように見えます。)
また、そこで何が起こっているのかを理解するのは非常に困難です。私は非同期部分でロギングを拡張することに取り組んでいます。しかし、問題がどこにあるのか、すべてのテストを実行せずに問題を再現する方法はまだわかりません。:/ MSTestのスレッドの問題について読んだことがあります。考慮すべき特別なことがありますか?