Application.DoEvents
을 사용할 필요성은 언제 무엇입니까?Application.DoEvents, 필요할 때 언제 아닌가?
답변
Application.DoEvents
은 대개 UI 스레드에서 장기 실행 작업을 수행 할 때 이벤트가 정기적으로 처리되도록합니다.
더 나은 해결책은 그렇게하는 것이 아닙니다. UI를 업데이트해야 할 때 UI 스레드 (Control.BeginInvoke
/Invoke
또는 BackgroundWorker
)로 정렬하여 별도의 스레드에서 장기 실행 작업을 수행하십시오.
Application.DoEvents
에는 재진입 가능성이 있으며 이로 인해 이해하기 어려운 버그가 발생할 수 있습니다.
매우 예기치 않은 동작으로 끝날 수 있으므로 사용하지 않는 것이 좋습니다. 그냥 생성 된 코드는 괜찮습니다. 귀하가 현재 가지고있는 이벤트 핸들러를 다시 실행하고 있습니다. 왜냐하면 사용자가 키를 두 번 누르기 때문입니다. 현재 프로세스를 표시하기 위해 컨트롤을 새로 고치려면 호출 대신 해당 컨트롤의 Update를 명시 적으로 호출해야합니다. Application.DoEvents.
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
- 1. Twisted LoopingCall은 필요할 때 직렬화됩니다.
- 2. XeTeX - 재실행이 필요할 때 감지합니다.
- 3. wxPython Application.DoEvents()와 동등한가요?
- 4. .net on Application.DoEvents
- 5. WinForms 용 Application.DoEvents()입니까?
- 6. iPhone에 상응하는 Application.DoEvents();
- 7. 로깅이 필요할 때 어떤 디자인 패턴을 고려합니까?
- 8. IIS7 : AppDomain이 필요할 때 재활용되지 않습니까?
- 9. 데이터베이스 연결을 사용하거나 필요할 때 연결 하시겠습니까?
- 10. 필요할 때 USB 드라이브에서 .NET Framework 설치
- 11. 여러 크기가 필요할 때 이미지를 어떻게 저장해야합니까?
- 12. : 레코드 값이 필요할 때 collection_select에 프롬프트가 표시됩니다.
- 13. 필요할 때 자동로드 기능/클래스 라이브러리
- 14. Delphi : 필요할 때 UAC 표고 승격
- 15. 목록보기가있는 조각이 필요할 때 목록을 대체하지 않습니까?
- 16. 필요할 때만 데이터베이스에 연결하십시오.
- 17. 2 같아야하는 NSDate가 아닌가?
- 18. 어떻게 이것을 루프가 아닌가?
- 19. 직렬화 어셈블리. 필요하거나 아닌가?
- 20. Application.DoEvents() 내부에서 예외를 catch 할 수 있습니까?
- 21. .NET 스레딩 모델 및 Application.DoEvents 대 Thread.Sleep
- 22. 어떻게 누출이 아닌가? (iphone sdk)
- 23. 가장 좋은 방법은 jQuery가 아닌가?
- 24. HttpContext.Current가 WCF 서비스에서 null이 아닌가?
- 25. mySQL : 언제 업데이트해야하는지, 언제 삽입해야하는지 알고 있습니까?
- 26. Linq 쿼리에서 IQueryable을 만들 때 왜 "새로운"변수가 아닌가?
- 27. Visual Studio 성능 프로파일 링 : Application.DoEvents()
- 28. Java 패키지 - 버튼을 생성하고 필요할 때 가져 오기.
- 29. 내 정규식에 공백이 필요할 때 findstr을 사용하는 방법
- 30. 주의가 필요할 때 Windows 작업 표시 줄에서 JFrame을 플래시하는 방법
존, 당신은 ... 확실히 이벤트를 주기적으로 취급받을하는 이벤트를 만들라고? 순차 프로그래밍에서 폼에 버튼이 있다고 가정합니다. 예를 들어 사용자가 클릭하면 양식의 불투명도가 변경됩니다 ... 지금 버튼 클릭을 제외하고 여기에 어떤 종류의 이벤트가 있습니까? – odiseh
응용 프로그램 코드가 대부분을 명시 적으로 처리하지 않더라도 이벤트가 많이 발생합니다. –
@JonSkeet'DoEvents'의 가능한 유효한 사용에 대한 귀하의 의견을 환영합니다. https://stackoverflow.com/questions/45023826/is-this-a-valid-use-of-doevents-sample-project-included –