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
내가보고있는 첫 번째 일은 동기화가 완전히 부족하다는 것입니다. 일부 잠금 장치가 필요합니다. 추가 후 백작은 무엇입니까? 그리고 foreach 직전 백작님은 무엇입니까? 또한 루프가 isRunning에 대한 업데이트를 결코 볼 수 없을 가능성이 있습니다 (확실히 보장되지 않습니다). –
나는 스레딩을 잘 경험하지는 못했지만 일부 잠금 장치가 필요하다고 생각했습니다. 나는 자물쇠가 어떻게 작동하는지에 대한 기본적인 이해를 가지고 있다고 생각한다. 내가 시도한 것은 사전에 클라이언트를 추가 할 때 잠금 장치를 추가하는 것이었다. 나는 또한 동시 액세스에 도움이 될 잠금 생각 안에 foreach 루프를 두어 보았습니다. 그래도 그것이 올바른 방법인지 확실하지 않습니다. 카운트에 관해서는 카운트가 증가하고 있는지를보기 위해 foreach를 시도하기 전에 카운트는 업데이트 섹션의 foreach 루프 이전에 0입니다. – Jarryd
Count를 추가 한 후 1 이었지만 foreach 문 바로 아래에 실제로 값을 추가했다는 것을 보여 주었지만 그 코드를 추가하지 않았습니다. 루프는 100ms마다 트리거 된 디버그 문이 있기 때문에 루프가 실행되고 있다고 확신합니다. – Jarryd