■ Single 동시성 모드를 사용하는 방법을 보여준다.
[TestServer 프로젝트]
▶ ISimpleService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
using System.Collections.Generic; using System.ServiceModel; namespace TestServer { /// <summary> /// 단순 서비스 /// </summary> [ServiceContract] public interface ISimpleService { //////////////////////////////////////////////////////////////////////////////////////////////////// Method #region 짝수 번호 리스트 구하기 - GetEvenNumberList() /// <summary> /// 짝수 번호 리스트 구하기 /// </summary> /// <returns>짝수 번호 리스트</returns> [OperationContract] List<int> GetEvenNumberList(); #endregion #region 홀수 번호 리스트 구하기 - GetOddNumberList() /// <summary> /// 홀수 번호 리스트 구하기 /// </summary> /// <returns>홀수 번호 리스트</returns> [OperationContract] List<int> GetOddNumberList(); #endregion } } |
▶ SimpleService.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
using System; using System.Collections.Generic; using System.ServiceModel; using System.Threading; namespace TestServer { /// <summary> /// 단순 서비스 /// </summary> [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.PerSession)] public class SimpleService : ISimpleService { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 짝수 번호 리스트 구하기 - GetEvenNumberList() /// <summary> /// 짝수 번호 리스트 구하기 /// </summary> /// <returns>짝수 번호 리스트</returns> public List<int> GetEvenNumberList() { Console.WriteLine ( "[{0}] 짝수 번호 리스트 구하기 스레드 {1}가 시작되었습니다.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ManagedThreadId ); List<int> listEvenNumberList = new List<int>(); for(int i = 0; i <= 10; i++) { Thread.Sleep(200); if(i % 2 == 0) { listEvenNumberList.Add(i); } } Console.WriteLine ( "[{0}] 짝수 번호 리스트 구하기 스레드 {1}가 완료되었습니다.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ManagedThreadId ); return listEvenNumberList; } #endregion #region 홀수 번호 리스트 구하기 - GetOddNumberList() /// <summary> /// 홀수 번호 리스트 구하기 /// </summary> /// <returns>홀수 번호 리스트</returns> public List<int> GetOddNumberList() { Console.WriteLine ( "[{0}] 홀수 번호 리스트 구하기 스레드 {1}가 시작되었습니다.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ManagedThreadId ); List<int> listOddNumberList = new List<int>(); for(int i = 0; i <= 10; i++) { Thread.Sleep(200); if(i % 2 != 0) { listOddNumberList.Add(i); } } Console.WriteLine ( "[{0}] 홀수 번호 리스트 구하기 스레드 {1}가 완료되었습니다.", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), Thread.CurrentThread.ManagedThreadId ); return listOddNumberList; } #endregion } } |
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; using System.ServiceModel; namespace TestServer { /// <summary> /// 프로그램 /// </summary> class Program { ////////////////////////////////////////////////////////////////////////////////////////// Method //////////////////////////////////////////////////////////////////////////////// Static ////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { using(ServiceHost serviceHost = new ServiceHost(typeof(SimpleService))) { serviceHost.Open(); Console.WriteLine("서버가 시작되었습니다 : " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); Console.ReadKey(true); } } #endregion } } |
▶ App.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="mexBehavior"> <serviceMetadata httpGetEnabled="true" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="TestServer.SimpleService" behaviorConfiguration="mexBehavior"> <endpoint address="SimpleService" binding="netTcpBinding" contract="TestServer.ISimpleService" /> <host> <baseAddresses> <add baseAddress="http://localhost:8080" /> <add baseAddress="net.tcp://localhost:8090" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration> |
[TestClient 프로젝트]
▶ MainForm.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
using System; using System.ComponentModel; using System.Windows.Forms; using TestClient.SimpleService; namespace TestClient { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 클라이언트 /// </summary> private SimpleServiceClient client; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); this.client = new SimpleServiceClient("NetTcpBinding_ISimpleService"); this.getEvenNumberListButton.Click += getEvenNumberListButton_Click; this.getOddNumberListButton.Click += getOddNumberListButton_Click; this.clearResultButton.Click += clearResultButton_Click; this.oddNumberBackgroundWorker.DoWork += oddNumberBackgroundWorker_DoWork; this.oddNumberBackgroundWorker.RunWorkerCompleted += oddNumberBackgroundWorker_RunWorkerCompleted; this.evenNumberBackgroundWorker.DoWork += evenNumberBackgroundWorker_DoWork; this.evenNumberBackgroundWorker.RunWorkerCompleted += evenNumberBackgroundWorker_RunWorkerCompleted; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 짝수 번호 리스트 구하기 버튼 클릭시 처리하기 - getEvenNumberListButton_Click(sender, e) /// <summary> /// 짝수 번호 리스트 구하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void getEvenNumberListButton_Click(object sender, EventArgs e) { this.evenNumberBackgroundWorker.RunWorkerAsync(); } #endregion #region 홀수 번호 리스트 구하기 버튼 클릭시 처리하기 - getOddNumberListButton_Click(sender, e) /// <summary> /// 홀수 번호 리스트 구하기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void getOddNumberListButton_Click(object sender, EventArgs e) { this.oddNumberBackgroundWorker.RunWorkerAsync(); } #endregion #region 결과 지우기 버튼 클릭시 처리하기 - clearResultButton_Click(sender, e) /// <summary> /// 결과 지우기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void clearResultButton_Click(object sender, EventArgs e) { this.evenNumberListBox.DataSource = null; this.oddNumberListBox.DataSource = null; } #endregion #region 짝수 번호 백그라운드 작업자 작업 처리하기 - evenNumberBackgroundWorker_DoWork(sender, e) /// <summary> /// 짝수 번호 백그라운드 작업자 작업 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void evenNumberBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { e.Result = this.client.GetEvenNumberList(); } #endregion #region 짝수 번호 백그라운드 작업자 작업 완료시 처리하기 - evenNumberBackgroundWorker_RunWorkerCompleted(sender, e) /// <summary> /// 짝수 번호 백그라운드 작업자 작업 완료시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void evenNumberBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.evenNumberListBox.DataSource = (int[])e.Result; } #endregion #region 홀수 번호 백그라운드 작업자 작업 처리하기 - oddNumberBackgroundWorker_DoWork(sender, e) /// <summary> /// 홀수 번호 백그라운드 작업자 작업 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void oddNumberBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { e.Result = this.client.GetOddNumberList(); } #endregion #region 홀수 번호 백그라운드 작업자 작업 완료시 처리하기 - oddNumberBackgroundWorker_RunWorkerCompleted(sender, e) /// <summary> /// 홀수 번호 백그라운드 작업자 작업 완료시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void oddNumberBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { this.oddNumberListBox.DataSource = (int[])e.Result; } #endregion } } |
▶ App.config
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <system.serviceModel> <bindings> <netTcpBinding> <binding name="NetTcpBinding_ISimpleService" /> </netTcpBinding> </bindings> <client> <endpoint address="net.tcp://localhost:8090/SimpleService" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_ISimpleService" contract="SimpleService.ISimpleService" name="NetTcpBinding_ISimpleService"> </endpoint> </client> </system.serviceModel> </configuration> |