C#에서 이벤트 대기
이 프로그래밍 문서에서는 C#의 이벤트를 간략하게 소개한 다음 C#의 이벤트 대기에 대해 설명합니다.
C#
의 이벤트
이벤트를 사용하면 특정 일이 발생할 때 클래스와 개체가 다른 클래스와 개체에 경고를 보낼 수 있습니다. 게시자 클래스는 이벤트를 보내고 이벤트를 받거나 처리하는 클래스를 구독자라고 합니다.
버튼 클릭, 마우스 이벤트(마우스 이동, 클릭, 더블 클릭 등), 키보드 이벤트 등과 같은 일부 이벤트는 기본적으로 선언됩니다. 하지만 이벤트도 선언할 수 있습니다.
이벤트 핸들러
이벤트 핸들러는 이벤트가 발생할 때 호출되는 함수입니다. 이러한 처리기는 해당 이벤트가 발생하고 작업을 수행할 때 자동으로 호출됩니다.
여러 이벤트 핸들러를 이벤트에 연결할 수 있으며 이벤트가 발생하면 모두 동기적으로 호출됩니다. 개체의 변경 상태를 클라이언트에 알리는 이벤트는 이벤트 처리기로 처리할 수도 있습니다.
따라서 이벤트가 발생하면 이벤트 처리기가 호출되고 이벤트 처리기 함수에서 해당 이벤트가 발생하면 수행해야 하는 작업을 코드에 지정할 수 있습니다.
C#
에서 이벤트 대기
이벤트 발생 시 함수를 호출해야 하는 경우는 매우 간단합니다. 예를 들어 버튼을 클릭하면 함수를 호출해야 합니다.
다른 이벤트가 끝나면 함수를 호출해야 할 때 상황이 복잡해집니다. 즉, 다른 이벤트가 작업을 완료할 때까지 이벤트 핸들러가 대기하도록 해야 합니다.
두 개의 버튼과 하나의 텍스트 필드라는 간단한 예를 통해 이를 시연해 보겠습니다. 첫 번째 버튼을 클릭해야 하고 이 버튼을 클릭하면 텍스트 필드에 "Welcome text"
를 제공해야 하지만 두 번째 버튼도 클릭할 때 해당 텍스트를 표시해야 합니다.
먼저 Windows 양식 응용 프로그램에서 양식을 만들고 다음 이미지와 같은 3개의 컨트롤, 2개의 버튼 및 텍스트 필드를 배치합니다.
button1
과 button2
를 모두 클릭하면 텍스트 필드를 채워야 합니다. 이 작업을 수행하려면 button1
처리기에서 button2
가 작업을 완료할 때까지 기다린 다음 텍스트 필드의 text
를 설정해야 합니다.
button1
의 이벤트 핸들러 기능은 TaskCompletionSource
클래스를 사용합니다. 이 클래스는 button1
에 대한 처리기가 button2
에 대한 처리기가 완료될 때까지 대기하도록 합니다.
암호:
TaskCompletionSource<bool> tcs = null;
private async void button1_Click(object sender, EventArgs e) {
tcs = new TaskCompletionSource<bool>();
label1.Text = "Click the Second Button";
await tcs.Task; // system will wait here
textBox1.Text = "You are done! ThankYou";
}
다른 메서드를 기다리는 메서드가 필요한 경우 해당 메서드를 async
로 선언한 다음 해당 메서드를 await
로 만듭니다. 두 번째 작업이 완료되면 이 시점에 반환됩니다.
private void button2_Click(object sender, EventArgs e) {
tcs.TrySetResult(true);
}
두 번째 버튼의 경우 버튼을 클릭하면 위의 핸들러 함수가 호출됩니다. 작업 완료를 true로 설정하여 대기 중인 작업에 다른 작업이 완료되었다는 신호를 보내 나머지 기능을 실행합니다.
출력:
첫 번째 버튼을 클릭하면 두 번째 버튼을 클릭하라는 메시지도 제공합니다. 두 번째 버튼을 클릭하면 어떤 일이 발생하는지 봅시다.
두 번째 버튼을 클릭하면 텍스트 필드에 첫 번째 버튼의 핸들러 기능에서 설정한 텍스트가 표시됩니다. 이는 첫 번째 버튼의 처리기 기능이 두 번째 버튼이 클릭되기를 기다린 다음 나머지 구현 실행을 완료했음을 의미합니다.
이런 식으로 이벤트가 작업을 완료할 때까지 기다릴 수 있습니다.