은 이제 나는이 간단한 코드 있다고 가정 해 봅시다 : (단순화)ConcurrentDictionary 및 atomic 연산 - 때때로 잠금이 필요합니까?
MyConCurrentDictionary
는 (다른 클래스에 존재하는) 정적
ConcurrentDictionary<string, string>
입니다
.
/*1*/ public void Send(string Message, string UserName)
/*2*/ {
/*3*/ string ConnectionId;
/*4*/ if (MyConCurrentDictionary.TryGetValue(UserName,out ConnectionId))
/*5*/ {
/*6*/ //...
/*7*/ DB.InsertMessage(Message, ConnectionId);
/*8*/ LOG.LogMessage (Message, ConnectionId);
/*9*/ //...
/*10*/ }
/*11*/ else ...
/*12*/ }
이 방법은 많은 경우 실행됩니다. (signalR 허브, 당신이 할 경우)
나는 user/connectionID
이있는 경우 DB
/log
만에 삽입해야합니다.
그렇게 OK 선 #4
인 스레드 멀티 스레드가 ConcurrentDictionary
액세스되지만 RemoveUser 또 다른 방법이있을 때 안전 - 사전에서 사용자를 제거 :
public void RemoveUser (string userName)
{
string removed;
if (MyConCurrentDictionary.TryRemove(userName,out removed))
Clients.All.removeClientfromChat(userName);
}
는하지만 그것이 가능한 문맥 #5
줄에서 발생합니다. RemoveUser
및 을 제거합니다. ConcurrentDictionary에서 UserName을 제거하십시오.
lock(locker)
{
if (MyConCurrentDictionary.TryGetValue(UserName,out ConnectionId))
{
//...
}
}
완전히 패배 내 ConcurrentDictionary
의 목적 : -
그래서이 문제를 해결하기 위해 코드는 다음과 같은 것이다.
질문
동안 다중 스레드 환경에서 같은 일을하고 오른쪽 방법은 무엇입니까 - 여전히 ConcurrentDictionary의 이익을 가지고가?
nb, 예 ConcurrentDictionary는 사전 내에서만 작동하는 스레드 안전입니다. 하지만 내가 말하고자하는 것은 특정 시나리오에서 ConcurrentDictionary의 이점을 잃어버린다는 것입니다. 여전히 잠금을 사용해야하기 때문입니다.
"ConcurrentDictionary에서 UserName을 제거하십시오."# 5에서 그런 코드가 보이지 않습니다. – Magnus
더 많은 코드를 보여주십시오. 어디에서 제거합니까? 'ConcurrentDictionary'는 thread safe 한'TryRemove' 메소드만을 가지고 있습니다. 그래서 그것이 당신의 문제가되어서는 안됩니다. 너의 문제는 무엇인가? –
@SriramSakthivel 공용 작업이 스레드 안전하다는 것을 알고 있습니다. 하지만 여전히 모든 것이 여전히 괜찮을 수 있지만, 다른 스레드는 라인 # 5 퀀텀에 들어가서 제거 할 수 있습니다 (사용자가 로그 아웃하기 때문에). 그래서 여기에 분무기가 필요합니다. –