2009-07-12 2 views

답변

17

Application.DoEvents은 대개 UI 스레드에서 장기 실행 작업을 수행 할 때 이벤트가 정기적으로 처리되도록합니다.

더 나은 해결책은 그렇게하는 것이 아닙니다. UI를 업데이트해야 할 때 UI 스레드 (Control.BeginInvoke/Invoke 또는 BackgroundWorker)로 정렬하여 별도의 스레드에서 장기 실행 작업을 수행하십시오.

Application.DoEvents에는 재진입 가능성이 있으며 이로 인해 이해하기 어려운 버그가 발생할 수 있습니다.

+0

존, 당신은 ... 확실히 이벤트를 주기적으로 취급받을하는 이벤트를 만들라고? 순차 프로그래밍에서 폼에 버튼이 있다고 가정합니다. 예를 들어 사용자가 클릭하면 양식의 불투명도가 변경됩니다 ... 지금 버튼 클릭을 제외하고 여기에 어떤 종류의 이벤트가 있습니까? – odiseh

+0

응용 프로그램 코드가 대부분을 명시 적으로 처리하지 않더라도 이벤트가 많이 발생합니다. –

+0

@JonSkeet'DoEvents'의 가능한 유효한 사용에 대한 귀하의 의견을 환영합니다. https://stackoverflow.com/questions/45023826/is-this-a-valid-use-of-doevents-sample-project-included –

1

매우 예기치 않은 동작으로 끝날 수 있으므로 사용하지 않는 것이 좋습니다. 그냥 생성 된 코드는 괜찮습니다. 귀하가 현재 가지고있는 이벤트 핸들러를 다시 실행하고 있습니다. 왜냐하면 사용자가 키를 두 번 누르기 때문입니다. 현재 프로세스를 표시하기 위해 컨트롤을 새로 고치려면 호출 대신 해당 컨트롤의 Update를 명시 적으로 호출해야합니다. Application.DoEvents.

2

Windows는 클릭, 크기 조정, 닫기 등과 같은 다양한 이벤트를 보관할 큐를 유지 관리합니다. 컨트롤이 이벤트에 응답하는 동안 다른 모든 이벤트는 큐에 다시 보관됩니다. 따라서 응용 프로그램이 버튼 클릭을 처리하는 데 너무 오래 걸리면 응용 프로그램의 나머지 부분이 멈추는 것처럼 보입니다. 결과적으로 이벤트에 응답하여 무거운 처리를 수행하는 동안 응용 프로그램이 응답하지 않을 수도 있습니다. UI가 고정되지 않도록 비동기 방식으로 처리하는 것이 이상적이지만 이상적인 방법은 Application.DoEvents()를 주기적으로 호출하여 보류중인 이벤트를 응용 프로그램에 보낼 수있게하는 것입니다.

좋은 Windows 응용 프로그램의 경우 최종 사용자는 더 크고 중량이 많은 작업을 수행하는 동안 응용 프로그램의 양식이 멈추는 것을 좋아하지 않습니다. 사용자는 항상 UI를 고정시키는 대신 응용 프로그램을 원활하고 신속하게 응답하기를 원합니다. 하지만 인터넷 검색 후 Application.DoEvents() 응용 프로그램에서 더 자주 사용하는 좋은 연습 아니므로이 이벤트 대신 BackGround Worker Thread를 사용하여 Windows가 멈추지 않고 오래 실행되는 작업을 수행하는 것이 좋습니다.

실제로 볼 때 더 좋은 아이디어를 얻을 수 있습니다. 다음 코드를 복사하고 Application.DoEvents()를 사용하거나 사용하지 않고 응용 프로그램을 확인하십시오.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     For i As Integer = 0 To 1000 
      System.Threading.Thread.Sleep(100) 
      ListBox1.Items.Add(i.ToString()) 
      Application.DoEvents() 
     Next 
    End Sub 
관련 문제