public ServerMain()
{
InitializeComponent();
Thread ServerMain = new Thread(Server_MainLoof);
ServerMain.Start();
}
private void Server_MainLoof() //서버의 메인루프
{
CheckForIllegalCrossThreadCalls = false;
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, Constants.Server_Port);
//서버의 아이피와 객체를 담기위한 객체
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//서버소켓 생성
ServerSocket.Bind(ipep); // bind
ServerSocket.Listen(20); // listen
sLog.AppendText("ip: " + ipep.Address + " port: " + ipep.Port + " Server Start....");
while (true)
{
Accept_Client(ServerSocket);
}
}
이런식으로 네트워크 프로그래밍을 하고 있었는데 sLog.AppendText 이 부분에서 크로스 스레드 에러가 발생한다.
크로스 스레드 에러란 메인 스레드에서 만들어진 ui가 메인 스레드외에 다른 스레드에서 접근할경우 발생하는 에러이다.
이럴경우는
private delegate void Delegate(string sData);
private void DelegateFunction(string sData)
{
sLog.AppendText(sData);
}
델리게이트를 선언 해 주고
this.Invoke(new Delegate(DelegateFunction), "hello");
델리게이트로 값을 넘겨 주어서 해결 하면 된다.
그 외에 간단하게 해결 하는 방법은
this.Invoke(new MethodInvoker(
delegate()
{
sLog.AppendText("hello");
}
)
);
이런식으로 MethodInvoker를 이용해 델리게이틀르 연결 하는 방법 인데 이 방법은 너무 많이 쓰면 소스가 지저분해지는 것 같다
'Programing > C#' 카테고리의 다른 글
c# 크로스 스레드(CheckForIllegalCrossThreadCalls) (1) | 2015.01.05 |
---|---|
(C#) Semaphore Release (0) | 2014.07.08 |
(C#) FiFo Semaphore (0) | 2014.07.02 |