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 回答