2012-05-30 33 views
2

我找不到這個簡單問題的答案:BeginInvoke()保證以原子方式執行被調用的委託? 舉例來說,如果我有像Dispatcher.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的準確而另一個線程處於中間更新?

+1

提示:在哪個線程/執行上下文上Dispatcher運行排隊的動作? – 2012-05-30 04:52:50

回答

3

由於所有調用的方法都在同一個線程上運行,您將得到有力的保證。所以通過設計他們必須按順序運行,並且永遠不會重疊。所以Items集合是完全安全的,不需要鎖定,原子性不是問題。

線程完成時集合中項目的確切順序是完全非確定性的。