Dispatcher.BeginInvoke()是否以原子方式工作?

时间:2012-05-30 04:47:48

标签: c# wpf multithreading 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 个答案:

答案 0 :(得分:3)

所有被调用的方法都在同一个线程上运行,这将得到强有力的保证。因此,通过设计,它们必须按顺序运行并且永远不会重叠。所以Items集合是完全安全的,不需要锁定,原子性不是问题。

线程完成时集合中项目的确切顺序是完全不确定的。