-1

データベース全体をクリーンアップし、指定された状態を設定するため、シリアルに実行する必要がある C# ユニット テストがいくつかあります。これを並行して行うと、予期しない動作が発生します。そのため、XML で並列テストの数を 1 に設定しようとしましたが、それでも並列テストが実行されました。したがって、私の次のアプローチは、メソッド/拡張機能を使用[TestInitialize()][TestCleanup()]てシリアル処理を強制することでした。

これが私のコードです:

    static Object exclusiveDbAccess = new Object();

    //Use TestInitialize to run code before running each test
    [TestInitialize()]
    public void MyTestInitialize()
    {
        lock (exclusiveDbAccess)
        {
            Monitor.Enter(exclusiveDbAccess);
        }
    }

    //
    //Use TestCleanup to run code after each test has run
    [TestCleanup()]
    public void MyTestCleanup()
    {
        lock (exclusiveDbAccess)
        {
            Monitor.Exit(exclusiveDbAccess);
        }
    }

これはほとんどの場合うまくいくように見えますが、(これでもめったにありませんが) まだいくつかの並列テストが実行されているように見える効果がありました。これはコンピュータに多くの負荷がかかるときに常に発生するため、「lock()」のタイムアウト (たとえば 10 秒または 30 秒後) が原因ではないかと考えていました。たとえば、ロックの取得に x 秒間失敗した後に lock () ブロックがスキップされると、これらの問題が発生する可能性があります。

したがって、その「ロック」ステートメントの正確な動作を専門家に教えてもらいたいと思います。「推測」だけを投稿しないでください。lock() がタイムアウトすることがわかっている場合、経験報告はもちろん大歓迎です...

4

2 に答える 2

2

それは私には間違った使い方のようです。

lock(syncObject) { somecode }

基本的に同じことをします

Monitor.Enter(syncObject);
try { somecode } 
finally { Monitor.Exit(syncObject); }

したがって、同じオブジェクトに対してlockand Monitor.Enter/を実行するのは正しくないようですMonitor.Exit

明示的にタイムアウトを設定しない限り、どちらもタイムアウトするべきではありません(のようにMonitor.TryEnter(syncObject, timeout)

msdn +を参照してください

于 2013-07-02T10:46:40.297 に答える
1

それらはタイムアウトしませんが、 and は使用しないでlock ください Monitor.Enter()

次のようにする必要があります。

static Object exclusiveDbAccess = new Object();

//Use TestInitialize to run code before running each test
[TestInitialize()]
public void MyTestInitialize()
{
    Monitor.Enter(exclusiveDbAccess);
}

//
//Use TestCleanup to run code after each test has run
[TestCleanup()]
public void MyTestCleanup()
{
    Monitor.Exit(exclusiveDbAccess);
}

フォームのlockステートメント

lock (x) ...

は次のように正確に実装されます。

System.Threading.Monitor.Enter(x);
try {
    ...
}
finally {
    System.Threading.Monitor.Exit(x);
}

(C# 言語仕様、セクション 8.12 より)

于 2013-07-02T10:38:57.400 に答える