2012. 6. 3. 22:05

메인 클래스의 combo box 를 socket 쓰레드에서 받은 메시지들로 채워 주려고 하였다. 

하지만 WPF 에서는 각 UI가 전부 스레드로 동작 된다. 스레드간의 변수 공유는 WPF 에서 기본적으로 막아 놨기 때문에 다른 방법을 써서 이 둘을 이어 줘야 한다. 


우선 singletonepattern 방식을 이용하여 하나의 클래스를 다시 생성해주고, 그 클래스에 combobox 형태의 객체를 static 으로 선언해 주자. 


Singletone.cs

 using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Controls;



static class Singletone

{


    public static ComboBox combo; 

}



이후 메인 클래스 에서는 이 combo 라는 변수에 comboBox 를 대입해 준다. 


 Singletone.combo = combo_query; 



이렇게 대입해 준뒤, 외부 스레드(여기서는 소켓 스레드) 의 코드는 dispacher 라는 방법으로 이어준다.



      Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate

     {

          Singletone.combo.Items.Add(msg);

      }));

Dispatcher.Invoke 는 비동기식으로 변수를 사용 하겠다는 선언 같은 것이다. 

이 Dispatcher.Invoke 는 Window 클래스를 상속 받고 있어야 한다. 


소켓 클래스 구현부는 다음과 같다.


 

    public class ServerSock : Window

    {

        public void ServerRun()

        {

            //  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];

            IPAddress ipAddress = IPAddress.Parse("127.0.0.1");



            Console.WriteLine("ipAddress" + ipAddress);

            TcpListener tcp_Listener = new TcpListener(ipAddress, 5555);

            tcp_Listener.Start();

            while (true)

            {

                Console.WriteLine("1. EchoServer 대기상태.......");


                TcpClient client = tcp_Listener.AcceptTcpClient();      //클라이언트와 접속

                Console.WriteLine("2. Echo Client 접속....");


                NetworkStream ns = client.GetStream();

                StreamReader reader = new StreamReader(ns);

                string msg = reader.ReadLine();                     //메시지를 읽어 옴


                Console.WriteLine("3. [클라이언트 메시지]:" + msg);     //메시지 출력


                reader.Close();

                client.Close();




                Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate

                {

                    Singletone.combo.Items.Add(msg);

                }));


            }


        }

    }





Posted by k1rha