C#으로 서버를 만들고 있는데 배열에 로그인 한 모든 사용자를 처리하는 싱글 톤이 있습니다. 이 배열은 UserSession이라는 클래스의 배열입니다.클래스 내부의 여러 메소드를 처리하는 가장 좋은 방법은 무엇입니까?
이 UserSession 클래스에는 해당 사용자의 들어오는 패킷을 처리하는 별도의 스레드에서 실행되는 메서드가 있습니다.
class UserSession
{
public UserSession(TcpClient client)
{
var thread = new Thread(new ParameterizedThreadStart(HandleComm);
thread.Start((object)client);
}
public void HandleComm(object tcpClient)
{
TcpClient client = (TcpClient)tcpClient;
NetworkStream stream = client.GetStream();
while(1 == 1)
{
byte[] buffer = new byte[4096];
stream.Read(buffer, 0, buffer.Length);
int testShort = Convert.ToInt32(buffer);
switch((ActionEnum)testShort)
{
case ActionEnum.Something:
// here is my problem!
// do some more parsing of the message
this.DoSomething(SomethingStruct argument); // argument taken from the byte array
break;
case ActionEnum.AnotherSomething:
// the same as before
break;
// and this goes on and on
}
}
}
}
어떤 것, 그 클래스에 80 개 이상의 방법을 반복하지 않고 모든 별도의 열거를 처리하는 가장 좋은 방법 :
음,이 코드를 고려? (ActionEnum은 현재 사용자의 특정 동작이있는 enum입니다.)
나는 그 버퍼를 직렬화한다, 나는 그 코드를 당신이 생각하기에 빨리 만들었다.
책임 http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern의
명령 패턴 http://en.wikipedia.org/wiki/Command_pattern
체인'UserSession'은 싱글입니까? 공공 생성자가 있습니다 – Habib
생산 코드에서 어떤 stream.Read()가 반환 되더라도 처리하길 바랍니다. 질문에 관해서는, 많은 방법을 가지고있는 문제는 무엇입니까? 몇 줄의 코드 만 수행하면 핸들링 자체가 케이스 자체에 남아있을 수 있습니다. 그렇지 않으면 아마도 방법이 있어야합니다. upd : 객체가 일률적으로 직렬화되는 경우 실제로는 수신 메시지의 형식에 대한 설명이 인수로 포함 된 하나의 메소드 일 수 있습니다. –
@ Habib.OSU LoggedUsers라는 클래스 내에 UserSession 배열이 있습니다. 싱글 톤입니다. – Pacha