Note ≡ Windows Forms에서 동기 프로그램 작동 방식 확인
이 책 범위에는 Windows Forms가 포함되지 않았기에 지금 설명하는 내용은 참고용으로만 읽고 넘어가세요. 다음 순서대로 따라 하기 쉽지 않으니 예제 소스에서 Dinner 솔루션의 Dinner.Sync.WindowsForms 프로젝트를 참고하세요. 다음 순서는 참고용으로 표시했습니다.
1. Dinner 솔루션에 Dinner.Sync.WindowsForms 이름의 Windows Forms 프로젝트를 추가한 후 Dinner.Sync.WindowsForms에 Dinner.Common 프로젝트 참조를 추가합니다. 솔루션 탐색기의 Dinner.Sync.WindowsForms 프로젝트의 종속성에서 마우스 오른쪽 버튼을 눌러 참조 추가를 선택합니다. 이때 나타나는 창에서 솔루션 내의 Dinner.Common 프로젝트를 체크하여 DLL 참조를 추가합니다.
2. Form1.cs 파일을 FrmDinnerSyncWindowsForms.cs 파일로 이름을 변경합니다.
3. FrmDinnerSyncWindowsForms.cs 파일의 디자인 모드에 다음과 같이 디자인합니다. 버튼 2개(btnMakeDinner, btnWachingTV)와 다음 그림에서는 볼 수 없지만 레이블 하나(lblDisplay)를 등록합니다.
▲ 그림 56-4 Windows Forms 폼 디자인
4. FrmDinnerSyncWindowsForms.cs 파일의 코드 모드에 다음과 같이 코드를 작성합니다.
//FrmDinnerSyncWindowsForms.cs using Dinner.Common; using System; using System.Diagnostics; using System.Windows.Forms; namespace Dinner.Sync.WindowsForms { public partial class FrmDinnerSyncWindowsForms: Form { public FrmDinnerSyncWindowsForms() { InitializeComponent(); } private void btnMakeDinner_Click(object sender, EventArgs e) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); //① 밥 만들기 Rice rice = (new Cooking()).MakeRice(); lblDisplay.Text = $"밥 준비 완료 - {rice.GetHashCode()}"; //② 국 만들기 Soup soup = (new Cooking()).MakeSoup(); lblDisplay.Text = $"국 준비 완료 - {soup.GetHashCode()}"; //③ 달걀 만들기 Egg egg = (new Cooking()).MakeEgg(); lblDisplay.Text = $"달걀 준비 완료 - {egg.GetHashCode()}"; stopwatch.Stop(); lblDisplay.Text = $"\n시간 : {stopwatch.ElapsedMilliseconds}밀리초"; lblDisplay.Text = ("동기 방식으로 식사 준비 완료"); } private void btnWachingTV_Click(object sender, EventArgs e) { lblDisplay.Text = "TV 보는 중... " + DateTime.Now.Millisecond.ToString(); } } }
5. 프로젝트를 시작 프로젝트로 설정한 후 Ctrl+ F5를 누릅니다. 식사 준비를 누른 후 3초 이내에 TV 보기를 누르려고 하면 눌러지지 않습니다. 동기 프로그램은 식사를 준비하는 동안 다른 일련의 작업을 진행할 수 없음을 데모로 확인했습니다. 조금 뒤에 살펴볼 Note에서 동기 방식을 비동기 방식으로 바꾸어서 실행하면 식사 준비를 누른 후 TV 보기를 누를 수 있습니다.
▲ 그림 56-5 동기 프로그램 실행 테스트