C# 오랜 시간 실행되는 Windows Form의 이벤트 중간에 다른 폼의 이벤트를 실행 하는 방법


C# 닷넷으로 업무용 응용 프로그램을 많이 개발하게 됩니다. 특히 윈도우 응용 프로그램은 닷넷으로 개발하면 다른 개발 언어에 비해 쉽게 응용 프로그램을 개발할 수 있습니다.

하나의 응용 프로그램을 개발할 때 여러 개의 메뉴로 구성된 응용 프로그램을 개발하게 됩니다.

관리 메뉴, 집계 메뉴, 조회 메뉴, 출력 메뉴 등 제대로 된 응용 프로그램을 하나 개발하기 위해서는 수십 개에서 수백 개의 윈폼으로 이루어진 프로그램을 개발하게 됩니다.

하나의 응용 프로그램에서 특정 메뉴(윈폼)이 실행 중, 즉 프로세스가 돌아가고 있는 동안 다른 메뉴(윈폼)를 사용할 수 없게 됩니다.

예를 들어 몇 십분 돌아가는 집계 프로그램을 실행 중이거나, 몇 분 동안 돌아가는 조회 프로그램을 실행 중일 때 해당 실행이 종료될 때까지 추가로 아무런 작업을 할 수 없게 되는 것입니다.
실행 중인 프로그램(윈폼)을 클릭하거나 윈도우 창을 움직이려 할 때 “응답없음”으로 표시되는 이유도 현재 프로세스가 실행 중이므로 다른 작업을 할 수 없음을 알려 주고 있는 것입니다.

아주 긴 시간 동안 실행되는 프로세스, 즉 오래 걸리는 작업 또는 계산을 수행하는 경우, 이 상태에서 다른 작업을 하려면 어떻게 하면 될까요?

이번 글에서는 C# 오랜 시간 실행되는 Windows Form의 이벤트 중간에 다른 폼의 이벤트를 실행 하는 방법에 대해 알아보겠습니다.

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를 사용할 때 주의할 점

  1. 윈 폼의 실행 버튼을 클릭해서 오랜 시간 돌아가는 이벤트의 코드가 처리되는 동안 또 실행 버튼을 클릭하지 않도록 한번 실행하면 실행 버튼을 비활성화로 속성을 변경해 둘 필요가 있습니다.
    사용자가 실수로 실행 버튼을 반복적으로 누르는 것을 방지해야 오류 또는 예기치 않는 문제가 발생하지 않습니다.
  2. public static으로 connection을 선언해서 사용하면 안됩니다.
    코드가 실행 중인 상태에서 동일한 connection을 다른 폼에서 Open할 경우 당연히 오류가 발생하게 됩니다.
  3. 시간이 오래 걸리는 작업은 비동기 프로그래밍 방식의 프로그램 개발도 고려해 보는 것이 좋습니다.

마무리

하나의 윈 폼이 실행되는 동안 다른 작업을 하지 못하고 해당 실행이 끝날 때까지 무작정 기다리는 것이 일반적인 Windows Form의 실행 방식이었습니다.

몇 십 초 또는 몇 분 이내의 짧은 실행 시간인 경우는 실행이 종료될 때까지 기다리는 것이 크게 문제 되지 않습니다.

하지만 시간이 오래 걸리는 작업 또는 계산을 수행하는 경우 Application.DoEvents 메서드를 사용하여 다른 작업을 병행해서 할 수 있도록 해 주는 것이 사용자가 좀 더 편리하게 프로그램을 사용할 수 있게 됩니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기