2012-11-25 2 views
0

나는 쉽게 해결할 수있는 문제가 있습니다. 나는 지난 며칠 동안 답을 찾았으나 아직 운이 없다. 내가 뭘 하려는지 정적 사전에 연결된 클라이언트를 나타내는 것입니다, 최종 목표는 다른 플레이어 위치와 같은 연결된 클라이언트 데이터를 모두 전송하는 것입니다. 어쨌든, 지금까지 수행 한 클라이언트가 처음 연결할 때이다했는지, 내가 지금처럼 정적 사전에 추가 :정적 사전 내용이 변경되지 않음

RegionServer.RegionClients.Add(UserId, this); 
Log.DebugFormat("Added peer to region list"); 

foreach (var client in RegionServer.RegionClients) 
{ 
    Log.DebugFormat("Client id in list : {0}", client.Key); 
} 

나는 클라이언트가 정말에 추가되어 있는지 확인하기 위해 디버그 문에 추가 목록입니다.

public override void InitBackgroundThreads() 
    { 
     ThreadPool.QueueUserWorkItem(SendUpdatesToAll); 
    } 

public void SendUpdatesToAll(object threadContext) 
    { 
     Stopwatch timer = new Stopwatch(); 
     timer.Start(); 
     isRunning = true; 

     while (isRunning) 
     { 
      if (timer.Elapsed < TimeSpan.FromMilliseconds(100)) 
       continue; 

      Update(timer.Elapsed); 
      timer.Restart(); 
     } 
    } 

public void Update(TimeSpan elapsed) 
    { 

     foreach (KeyValuePair<Guid, Unity3dPeer> peer in RegionClients) 
       { 
        Log.DebugFormat("Inside the foreach statement"); 
       } 

내 디버그 로그에서 나는 루프가 참으로 반복되는 것을 볼 수 있지만, RegionClients 사전 값이 업데이트되지 않습니다 :

그런 다음 내 주요 파일에 내가있다. foreach 루프는 사전에 클라이언트가없는 것처럼 반복되지 않습니다. 어떤 도움이라도 대단히 감사 할 것입니다,이 문제는 나를 미치게했습니다! 미리 감사드립니다.

-jarryd

+1

내가보고있는 첫 번째 일은 동기화가 완전히 부족하다는 것입니다. 일부 잠금 장치가 필요합니다. 추가 후 백작은 무엇입니까? 그리고 foreach 직전 백작님은 무엇입니까? 또한 루프가 isRunning에 대한 업데이트를 결코 볼 수 없을 가능성이 있습니다 (확실히 보장되지 않습니다). –

+0

나는 스레딩을 잘 경험하지는 못했지만 일부 잠금 장치가 필요하다고 생각했습니다. 나는 자물쇠가 어떻게 작동하는지에 대한 기본적인 이해를 가지고 있다고 생각한다. 내가 시도한 것은 사전에 클라이언트를 추가 할 때 잠금 장치를 추가하는 것이었다. 나는 또한 동시 액세스에 도움이 될 잠금 생각 안에 foreach 루프를 두어 보았습니다. 그래도 그것이 올바른 방법인지 확실하지 않습니다. 카운트에 관해서는 카운트가 증가하고 있는지를보기 위해 foreach를 시도하기 전에 카운트는 업데이트 섹션의 foreach 루프 이전에 0입니다. – Jarryd

+0

Count를 추가 한 후 1 이었지만 foreach 문 바로 아래에 실제로 값을 추가했다는 것을 보여 주었지만 그 코드를 추가하지 않았습니다. 루프는 100ms마다 트리거 된 디버그 문이 있기 때문에 루프가 실행되고 있다고 확신합니다. – Jarryd

답변

0

그것은 간단합니다. 나는 클러스터 서버를 가지고 있고 다른 프로세스에서이 사전을 참조하려고했다. 아이디어를 가져 주셔서 감사합니다. 스레드로부터 안전하게 보호하려는 것보다 간단합니다.

관련 문제