메인 클래스의 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; } |
|
이렇게 대입해 준뒤, 외부 스레드(여기서는 소켓 스레드) 의 코드는 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); })); } } } |
'WPF Programma' 카테고리의 다른 글
C# 기본 TCP 소켓 통신 예제 코드 (Basic socket communication in C#) (0) | 2012.06.03 |
---|---|
C# 에서 Thread 돌리는 방법 (How to use thread in WPF ) (0) | 2012.06.03 |
[WPF] 윈도우 최대 확대 효과 주기 [Window MaxSize effect in WPF] (0) | 2012.06.03 |
WPF 창에 투명 airo 효과 주기 (0) | 2012.05.28 |
WPF 폴더 생성 & PPTX 불러와 이미지화 시키기 (0) | 2012.05.28 |