ConcurrentDictionary AddOrUpdate에서 업데이트 부분에 추가 할 항목
ConcurrentDictionary를 사용하기 위해 Dictionary를 사용하여 일부 코드를 다시 작성하려고합니다. 몇 가지 예를 검토했지만 여전히 AddOrUpdate 기능을 구현하는 데 문제가 있습니다. 이것은 원래 코드입니다.
dynamic a = HttpContext;
Dictionary<int, string> userDic = this.HttpContext.Application["UserSessionList"] as Dictionary<int, String>;
if (userDic != null)
{
if (useDic.ContainsKey(authUser.UserId))
{
userDic.Remove(authUser.UserId);
}
}
else
{
userDic = new Dictionary<int,string>();
}
userDic.Add(authUser.UserId, a.Session.SessionID.ToString());
this.HttpContext.Application["UserDic"] = userDic;
업데이트 부분에 무엇을 추가해야할지 모르겠습니다.
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
모든 포인터를 주시면 감사하겠습니다.
Func
업데이트시 사전에 저장할 값을 반환 하는를 전달해야합니다 . 귀하의 경우 (추가와 업데이트를 구별하지 않기 때문에) 이것은 다음과 같습니다.
var sessionId = a.Session.SessionID.ToString();
userDic.AddOrUpdate(
authUser.UserId,
sessionId,
(key, oldValue) => sessionId);
즉, Func
항상 sessionId를 반환하므로 Add와 Update가 동일한 값을 설정합니다.
BTW : MSDN 페이지 에 샘플이 있습니다.
나는 당신의 질문에서 아무것도 놓치지 않았기를 바랍니다. 그러나 왜 이렇게하지 않습니까? 더 쉽고 원자 적이며 스레드로부터 안전합니다 (아래 참조).
userDic[authUser.UserId] = sessionId;
키 / 값 쌍을 사전에 무조건 사전에 저장하고 키가 이미있는 경우 해당 키의 값을 덮어 씁니다. 인덱서의 setter를 사용합니다.
(참조 : http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
인덱서도 원자 적입니다. 대신 함수를 전달하면 다음과 같지 않을 수 있습니다.
이러한 모든 작업은 원자 적이며 ConcurrentDictionary의 다른 모든 작업과 관련하여 스레드로부터 안전합니다. 각 작업의 원자성에 대한 유일한주의 사항은 AddOrUpdate 및 GetOrAdd와 같은 대리자를 허용하는 작업에 대한 것입니다. [...] 이러한 위임은 잠금 외부에서 호출됩니다.
참조 : http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
결국 확장 메서드를 구현했습니다.
static class ExtensionMethods
{
// Either Add or overwrite
public static void AddOrUpdate<K, V>(this ConcurrentDictionary<K, V> dictionary, K key, V value)
{
dictionary.AddOrUpdate(key, value, (oldkey, oldvalue) => value);
}
}
관심이있는 사람들을 위해 저는 현재 새로운 값을 강요하는 대신 "oldValue"일명 기존 값을 사용하는 좋은 예를 구현하고 있습니다 (개인적으로 "oldValue"라는 용어는 병렬 스레드 내에서 몇 프로세서 틱 전에 생성되었을 때).
dictionaryCacheQueues.AddOrUpdate(
uid,
new ConcurrentQueue<T>(),
(existingUid, existingValue) => existingValue
);
'program story' 카테고리의 다른 글
부트 스트랩 모달이 열려 있는지 확인하는 방법으로 jquery validate를 사용할 수 있습니다. (0) | 2020.08.17 |
---|---|
rubytutorial을 따르려는 Windows의 ExecJS :: RuntimeError (0) | 2020.08.17 |
Node.js에서 거대한 로그 파일 구문 분석-한 줄씩 읽기 (0) | 2020.08.17 |
AngularJS에서 ng-pristine과 ng-dirty의 차이점은 무엇입니까? (0) | 2020.08.17 |
Swift 3.0의 NotificationCenter와 Swift 2.0의 NSNotificationCenter를 사용하여 데이터를 전달하는 방법은 무엇입니까? (0) | 2020.08.17 |