【问题标题】:Does Dispatcher.BeginInvoke() work atomically?Dispatcher.BeginInvoke() 是否以原子方式工作?
【发布时间】:2012-05-30 14:23: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 在哪个线程/执行上下文上运行排队的操作?

标签: c# wpf multithreading dispatcher


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2021-06-10
    相关资源
    最近更新 更多