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

C# Dispatcher.BeginInvoke()是否以原子方式工作?,c#,wpf,multithreading,dispatcher,C#,Wpf,Multithreading,Dispatcher,我找不到这个简单问题的答案:BeginInvoke()是否保证以原子方式执行被调用的委托? 例如,如果我有 public ObservableCollection<string> Items; public int TotalLenght; delegate void AddItemDelegate(string arg); Dispatcher _dispatcher=Dispatcher.CurrentDispatcher; void StartExecute() {

我找不到这个简单问题的答案: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();
}
公开可见的收集项目;
公共总工程师;
委托无效AddItemDelegate(字符串arg);
Dispatcher\u Dispatcher=Dispatcher.CurrentDispatcher;
void StartExecute()
{
对于(int-index=0;index<10;index++)
{
螺纹th=新螺纹(运行);
th.Start();
}
}
无效运行()
{
string item=DoLongRandomDuringCalculations();
_dispatcher.BeginInvoke(新的AddItemDelegate(AddItem),项);
}
无效附加项(字符串项)
{
项目。添加(项目);
总长度+=项目长度;
TakeSnapshot();
}

< P>我可以确信,对集合和其他成员的更新总是同步的,如果计算线程在另一个线程正在更新的过程中准确地调用SeaNojk?

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


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

提示:调度程序在哪个线程/执行上下文上运行排队操作?