0

非静的クラスを作成しました。

このクラス内には、同じクラスの静的メソッドを呼び出す非静的メソッドがあります。この静的メソッド内で、匿名メソッド (またはラムダ式など) で 2 つ以上の異なるスレッドが開始され、非常に大きな配列を個別に処理します。

これはすべて完璧に機能します!! 素晴らしいパフォーマンス、問題なし.....

しかし....静的ロックオブジェクトによって保護されているパブリック静的プロパティもあります...この静的プロパティをロックする以外の目的には使用しません。

すべて一緒にすると、どういうわけか次のようになります。

public class testClass
{
    private volatile static bool cancelProcessing;
    private static readonly object lockObj = new object();

    public static bool CancelProcessing
    {
        get
        {
            lock (lockObj)
            {return cancelProcessing;}
        }
        set
        {
            lock (lockObj)
            {cancelProcessing = value;}
        }
    }

    public void callingMethod()
    {
        staticThreadsMethods();
    }

    private static void staticThreadsMethods()
    {
         int parts = 4; // array parts
         CountdownEvent _countdown = new CountdownEvent(parts);
         for (int u = 0; u < parts; u++)
            {
                Threads[u] = delegate(object counter)
                {
                    // array gets processed
                    _countdown.Signal();
                };
         }

         _countdown.Wait();
    }
}

を呼び出した後、2 つまたは 4 つ以上のスレッドが...callingMethod()内の匿名デリゲート (またはラムダ式) と同時に開始されます。staticThreadsMethods()

さて、私が本当に理解できないのは次のとおりです。

CancelProcessingこのプロパティはスレッド内で使用されていませんが、すべてのスレッドが並行して実行されている間に、別のスレッドからプロパティの値を変更しますか(スレッドをキャンセルするために使用する必要がありましたが、常に同じエラー/例外が発生しました) )、プロパティ値を変更しただけで、配列への安全でないポインターが「逆参照できません...ポインターが無効になりました」(??)ため、System.AccessViolationExceptionが発生しますが、それ以外は何もしません... 。 何故ですか?

4

1 に答える 1