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

本文关键字:方式 工作 是否 BeginInvoke Dispatcher | 更新日期: 2023-09-27 18:35:46

>我找不到这个简单问题的答案: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?

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

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

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