在 AddOrUpdate 方法中更新键对象
Updating the key object in AddOrUpdate method
我有一个测试class。
class Test
{
public int Id { get; set; }
public int Val { get; set; }
}
我想设置一个 ConcurrentDictionary,其中 int 作为键,Test 作为值。
bool External = true;
ConcurrentDictionary<int, Test> data = new ConcurrentDictionary<int, Test>();
我想为这个字典编写 AddorUpdate 的更新部分,这样如果外部变量(比如外部)为真,那么该 Test 实例的 Val 应该增加 100,但如果 bool 为假,那么它应该减 100。有人能帮我吗,我该怎么做。我只是不确定如何使用 lambda 访问字典中的 Test 实例。尽管有 lambda,我也可以调用方法吗?
类似于:
data.AddOrUpdate(key, test, (k, t) =>
{
var newTest = new Test { Id = t.Id, Val = t.Val };
if (External)
newTest.Val += 100;
else
newTest.Val -= 100;
return newTest;
});
您示例中的 bool
External
将在匿名方法中作为 闭包 结束,因此它会变得非常奇怪并且有意想不到的结果。你会想以某种方式解决这个问题。
编辑:
我对这种方法不满意。我建议转到常规 Dictionary<int, Test>
并拉出当前值并更新它,全部使用 ReaderWriterLockSlim
以确保状态。
var key = ...;
var lock = new ReaderWriterLockSlim();
lock.EnterWriteLock();
try
{
if (dict.ContainsKey(key))
{
// update without closures
var test = dict[key];
if (External)
test.Val += 100;
else
test.Val -= 100;
}
}
else
{
// insert
var test = new Test { ...initial state... };
dict.Add(key, test);
}
finally
{
lock.ExitWriteLock();
}
最后,请务必将 External
标记为 volatile
以创建内存屏障并防止可能为您提供过时值的优化。
我有一个测试class。
class Test
{
public int Id { get; set; }
public int Val { get; set; }
}
我想设置一个 ConcurrentDictionary,其中 int 作为键,Test 作为值。
bool External = true;
ConcurrentDictionary<int, Test> data = new ConcurrentDictionary<int, Test>();
我想为这个字典编写 AddorUpdate 的更新部分,这样如果外部变量(比如外部)为真,那么该 Test 实例的 Val 应该增加 100,但如果 bool 为假,那么它应该减 100。有人能帮我吗,我该怎么做。我只是不确定如何使用 lambda 访问字典中的 Test 实例。尽管有 lambda,我也可以调用方法吗?
类似于:
data.AddOrUpdate(key, test, (k, t) =>
{
var newTest = new Test { Id = t.Id, Val = t.Val };
if (External)
newTest.Val += 100;
else
newTest.Val -= 100;
return newTest;
});
您示例中的 bool
External
将在匿名方法中作为 闭包 结束,因此它会变得非常奇怪并且有意想不到的结果。你会想以某种方式解决这个问题。
编辑:
我对这种方法不满意。我建议转到常规 Dictionary<int, Test>
并拉出当前值并更新它,全部使用 ReaderWriterLockSlim
以确保状态。
var key = ...;
var lock = new ReaderWriterLockSlim();
lock.EnterWriteLock();
try
{
if (dict.ContainsKey(key))
{
// update without closures
var test = dict[key];
if (External)
test.Val += 100;
else
test.Val -= 100;
}
}
else
{
// insert
var test = new Test { ...initial state... };
dict.Add(key, test);
}
finally
{
lock.ExitWriteLock();
}
最后,请务必将 External
标记为 volatile
以创建内存屏障并防止可能为您提供过时值的优化。