【发布时间】:2018-06-06 12:32:24
【问题描述】:
以下代码给了我一个例外:
var snapshot = BluetoothCapture.Instance.Snapshot();
var allowedDevice = snapshot.FirstOrDefault( _ => some_expression );
集合已修改;枚举操作可能无法执行。
我想我可以使用 lock 来冻结集合,以便我可以遍历它。但是,我仍然遇到同样的异常。
下面的类定义有一个 Snapshot 方法尝试这样做:
public partial class BluetoothCapture
{
...
public void Capture()
{
_watcher = DeviceInformation.CreateWatcher();
_watcher.Added += (s, e) => { _devices.Add(e); };
_watcher.Start();
}
public IEnumerable<DeviceInformation> Snapshot()
{
lock (_devices)
{
return _devices.AsReadOnly();
}
}
}
有什么建议吗?
【问题讨论】:
-
_devices的类型是什么? -
你读过
lock吗?它与此无关。 -
_devices.Add(e);至少这个也应该被锁定 -
请注意,
lock只是 每个人 必须同意使用的锁。这就像竖起一道门并说“每个想要进入该物业的人都必须通过大门,而我们在任何特定时间只允许一个人进入该物业”。换句话说,门口会有一个队列,等待该物业上的任何人退出。但是,锁/大门并不能阻止其他人完全无视大门。您想要等待的所有代码也必须使用锁,否则您最终会得到您现在看到的内容。