8

次のコードを取得すると、マルチスレッド環境で何が起こるか:

static Dictionary<string,string> _events = new Dictionary<string,string>();

public static Dictionary<string,string> Events { get { return _events;} }

public static void ResetDictionary()
{
    _events = new Dictionary<string,string>();
}

マルチスレッド環境では、このメソッドとプロパティは異なるスレッドから同時にアクセスできます。

別のスレッドでアクセス可能な静的変数に新しいオブジェクトを割り当てることはスレッドセーフですか? 何が問題になる可能性がありますか?

Events が null になる瞬間はありますか?? Eventsたとえば、2 つのスレッドが同時に呼び出す場合ResetDictionary()

4

2 に答える 2

0

マルチスレッド環境ですべてを制御したい場合は、すべてのスレッドからアクセスできるフラグを使用し、辞書で使用するメソッドを制御する必要があります!

// the dictionary
static Dictionary<string, string> _events = new Dictionary<string, string>();

// public boolean
static bool isIdle = true;

// metod that a thread calls
bool doSomthingToDictionary()
{
    // if another thread is using this method do nothing,
    // just return false. (the thread will get false and try another time!)
    if (!isIdle) return false;

    // if it is Idle then:
    isIdle = false;
    ResetDictionary(); // do anything to your dictionary here
    isIdle = true;
    return true;
}

別物!Invoke メソッドを使用して、1 つのスレッドが変数を操作したり、別のスレッドで関数を呼び出したりしているときに、他のスレッドがそうしないようにすることができます。リンクを参照してください: クロススレッド イベントを呼び出す最もクリーンな方法

于 2013-08-16T12:46:16.553 に答える