gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:28:27 25 4
gpt4 key购买 nike

我找不到这个简单问题的答案:BeginInvoke() 是否保证以原子方式执行被调用的委托(delegate)?例如,如果我有类似的东西

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 而另一个线程正在更新,我能否确保集合和其他成员的更新始终同步?

最佳答案

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

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

关于c# - Dispatcher.BeginInvoke() 是否以原子方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10810123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com