0

ミューテックスを含む多次元配列があり、それらをいくつかの重要なセクションで使用しています。最後に私のクラスのスケッチです。

今、停止せずに別のスレッドで文字を追加および削除しようとしましたが、同時に別のスレッドから文字を取得して、サーバーが正常に動作するかどうかをテストしましたが、次のような文字を取得しようとすると例外が発生しますthis: 「foreach 中にコレクションが変更されました..」

誰でも理由を知っていますか?MSDN のロック ステートメントのドキュメントを読みましたが、動作するはずです。何が間違っているのかわかりません。もしかしてnew object[]ミューテックスとして使えない?

この場合lock(objectReference)に使用すべきではない場合、代わりに何を使用すればよいですか?

私のクラスのスケッチ:

partial class MapCharacter
{
    public MapCharacter()
    {
        mutexes = new object[5, 5];
        for (int x = 0; x < 5; x++)
        {
            for (int y = 0; y < 5; y++)
            {
                mutexes[x, y] = new object();
            }
        }
    }

    object[,] mutexes;

    public object RequestMutex(int x, int y)
    {
        return mutexes[x, y];
    }

    public void RemoveCharacter(Character characterToRemove)
    {
        lock (RequestMutex(characterToRemove.X, characterToRemove.Y))
        {
            loggedCharacters.Remove(characterToRemove);
        }
    }

    public void AddCharacter(Character characterToAdd)
    {
        lock (RequestMutex(characterToRemove.X, characterToRemove.Y))
        {
            loggedCharacters.Add(characterToAdd);
        }
    }

    public Character[] GetCharacters(int x, int y)
    {
        lock (RequestMutex(characterToRemove.X, characterToRemove.Y))
        {
            foreach (var charact in loggedCharacters)
            {
                // exception here
            }
        }
    }

    // more methods that use the mutex when trying to remove/add/modify characters
}
4

1 に答える 1

4

問題は、個々の文字をロックしているが、ロックしていないことloggedCharactersです。loggedCharactersその例外を回避するには、ロックで保護するか、同時収集にする必要があります。

于 2012-10-12T21:53:05.167 に答える