gpt4 book ai didi

c# - 锁定语句似乎不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:10:04 30 4
gpt4 key购买 nike

我有这个方法:

public bool Remove(EntityKeyType key)
{
lock (syncroot)
{
//wait if we need to
waitForContextMRE.Wait();

//if the item is not local, assume it is not remote.
if (!localCache.ContainsKey(key)) return false;

//build an expression tree
Expression<Func<EntityType, bool>> keyComparitorExpression = GenerateKeyComparitorExpression(key);

var itemToDelete = TableProperty.Single(keyComparitorExpression);

//delete from db
TableProperty.DeleteOnSubmit(itemToDelete);
DataContext.SubmitChanges();

//get the removed item for OnCollectionChanged
EntityType itemToRemove = localCache[key];
itemToRemove.PropertyChanged -= item_PropertyChanged;

//remove from the list
Debug.Assert(localCache.Remove(key));

//call the notification
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, itemToRemove));
return true;
}
}

我从多个线程调用它(调用同一个实例),但在 TableProperty.Single 上不断抛出异常(序列不包含任何元素)。在调试代码时,我看到正在创建一种情况,即在另一个线程检查缓存是否存在后,项目正在从数据库中删除。这应该是不可能的,除非 lock 语句中有多个线程(syncroot 对象肯定是跨线程的同一个实例)。

不可能?我有证据: Impossible situation

lock语句里面有3个线程!给了什么?

注意事项:

  1. MRE 已设置(未阻塞)。
  2. 这不是抛出异常的情况,它只是显示锁定部分内有多个线程。 更新:我将图像更改为异常的 intellitrace 事件。旧图像是 here
  3. syncroot 对象不是静态的,因为我只想调用同步的同一个实例。

更新

这是同步根对象的声明:

private object syncroot = new object();

和一些其他声明:

private ManualResetEventSlim waitForContextMRE = new ManualResetEventSlim(true);
private DataContextType _dataContext;
private System.Data.Linq.Table<EntityType> _tableProperty;
//DataContextType and EntityType are generic type parameters

我无法将 syncroot 设置为静态,因为我有多个正在运行的类实例,并且它们不会相互阻塞很重要。但这并不重要 - 将其设为静态并不能解决问题。

ManualResetEvent (waitForContextMRE) 不用于同步 - 它用于在执行某些操作后(即启动时)在一段时间内阻止数据库操作。它大部分时间都已设置。将其从锁 block 中取出也不能解决问题。

最佳答案

我唯一的解释是 waitForContextMRE.Wait();调用它会使线程解除对 syncroot 的阻塞!因此其他线程可以进入锁定部分。尝试移动 waitForContextMRE.Wait();在锁定(...)之前。

关于c# - 锁定语句似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631793/

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