C# 닷넷으로 업무용 응용 프로그램을 많이 개발하게 됩니다. 특히 윈도우 응용 프로그램은 닷넷으로 개발하면 다른 개발 언어에 비해 쉽게 응용 프로그램을 개발할 수 있습니다.
하나의 응용 프로그램을 개발할 때 여러 개의 메뉴로 구성된 응용 프로그램을 개발하게 됩니다.
관리 메뉴, 집계 메뉴, 조회 메뉴, 출력 메뉴 등 제대로 된 응용 프로그램을 하나 개발하기 위해서는 수십 개에서 수백 개의 윈폼으로 이루어진 프로그램을 개발하게 됩니다.
하나의 응용 프로그램에서 특정 메뉴(윈폼)이 실행 중, 즉 프로세스가 돌아가고 있는 동안 다른 메뉴(윈폼)를 사용할 수 없게 됩니다.
예를 들어 몇 십분 돌아가는 집계 프로그램을 실행 중이거나, 몇 분 동안 돌아가는 조회 프로그램을 실행 중일 때 해당 실행이 종료될 때까지 추가로 아무런 작업을 할 수 없게 되는 것입니다.
실행 중인 프로그램(윈폼)을 클릭하거나 윈도우 창을 움직이려 할 때 “응답없음”으로 표시되는 이유도 현재 프로세스가 실행 중이므로 다른 작업을 할 수 없음을 알려 주고 있는 것입니다.
아주 긴 시간 동안 실행되는 프로세스, 즉 오래 걸리는 작업 또는 계산을 수행하는 경우, 이 상태에서 다른 작업을 하려면 어떻게 하면 될까요?
이번 글에서는 C# 오랜 시간 실행되는 Windows Form의 이벤트 중간에 다른 폼의 이벤트를 실행 하는 방법에 대해 알아보겠습니다.
Application.DoEvents를 사용하여 메시지 큐에 있는 모든 Windows 메시지를 처리
▶ Application.DoEvents 메서드는 현재 메시지 큐에 있는 모든 Windows 메시지를 처리하는 메서드 입니다.
Windows Form을 실행하면 새 폼 양식이 만들어지고 폼의 이벤트를 처리하게 됩니다. 폼이 이벤트를 처리할 때마다 해당 이벤트와 연결된 모든 코드를 처리하게 되는데 이때 해당 애플리케이션은 다른 이벤트에 더 이상 응답 하지 않는 상태에 놓이게 됩니다.
이벤트와 연결 된 모든 코드의 처리가 끝나야 다시 다른 이벤트를 처리할 수 있는 상태로 돌아가게 됩니다.
▼ 이벤트의 코드가 처리되는 동안 다른 이벤트를 처리하기 위해 아래 예제와 같이 Application.DoEvents() 메서드를 오랜 시간 돌아가는 구문에 추가해 주면 됩니다.
//해당 구문이 오랜 시간 동안 실행되는 이벤트라 가정
foreach (DataRow drow in ds.Tables[0].Rows) {
// 로직들….
// ………
Application.DoEvents(); //DoEvents 삽입
}
|
- 위 같이 Application.DoEvents 메서드를 있으면 다른 이벤트 처리를 또 할 수 있습니다.
- 다른 폼을 실행할 수 있게 됩니다.
Application.DoEvents를 사용할 때 주의할 점
- 윈 폼의 실행 버튼을 클릭해서 오랜 시간 돌아가는 이벤트의 코드가 처리되는 동안 또 실행 버튼을 클릭하지 않도록 한번 실행하면 실행 버튼을 비활성화로 속성을 변경해 둘 필요가 있습니다.
사용자가 실수로 실행 버튼을 반복적으로 누르는 것을 방지해야 오류 또는 예기치 않는 문제가 발생하지 않습니다. - public static으로 connection을 선언해서 사용하면 안됩니다.
코드가 실행 중인 상태에서 동일한 connection을 다른 폼에서 Open할 경우 당연히 오류가 발생하게 됩니다. - 시간이 오래 걸리는 작업은 비동기 프로그래밍 방식의 프로그램 개발도 고려해 보는 것이 좋습니다.
마무리
하나의 윈 폼이 실행되는 동안 다른 작업을 하지 못하고 해당 실행이 끝날 때까지 무작정 기다리는 것이 일반적인 Windows Form의 실행 방식이었습니다.
몇 십 초 또는 몇 분 이내의 짧은 실행 시간인 경우는 실행이 종료될 때까지 기다리는 것이 크게 문제 되지 않습니다.
하지만 시간이 오래 걸리는 작업 또는 계산을 수행하는 경우 Application.DoEvents 메서드를 사용하여 다른 작업을 병행해서 할 수 있도록 해 주는 것이 사용자가 좀 더 편리하게 프로그램을 사용할 수 있게 됩니다.
※ 함께 읽으면 도움이 될 만한 다른 포스팅 글입니다.
이 글이 도움이 되었기를 바랍니다. ^-^