2

この単純な質問に対する答えを見つけることができません:BeginInvoke()は、呼び出されたデリゲートをアトミックに実行することが保証されていますか?たとえば、私が次のようなものを持っている場合

public ObservableCollection<string> Items;
public int TotalLenght;

delegate void AddItemDelegate(string arg);
Dispatcher _dispatcher=Dispatcher.CurrentDispatcher;

void StartExecute()
{
    for (int index = 0; index < 10; index++)
    {
        Thread th=new Thread(Run);
        th.Start();
    }
}

void Run()
{
    string item = DoLongRandomDuringCalculations(); 
    _dispatcher.BeginInvoke(new AddItemDelegate(AddItem), item);
}

void AddItem(string item)
{
    Items.Add(item);
    TotalLength += item.Length;
    TakeSnapshot();
}

別のスレッドが更新の最中に計算スレッドがBeginInvokeを正確に呼び出した場合でも、コレクションと他のメンバーの更新が常に同期していることを確認できますか?

4

1 に答える 1

3

呼び出されたすべてのメソッドが同じスレッドで実行されるという事実から、強力な保証が得られます。したがって、設計上、それらは順番に実行する必要があり、重複することはありません。したがって、Itemsコレクションは完全に安全であり、ロックは必要ありません。アトミック性は問題ではありません。

ただし、スレッドが完了したときのコレクション内のアイテムの正確な順序は、完全に非決定的です。

于 2012-05-30T06:23:46.827 に答える