몇 가지 연구를 해본 결과 C#의 작업자 스레드에서 양식 컨트롤을 업데이트하는 기본 방법을 찾을 수 없습니다. BackgroundWorker 구성 요소에 대해 알고 있지만 BackgroundWorker 구성 요소를 사용하지 않고 수행하는 가장 좋은 방법은 무엇입니까?작업자 스레드에서 양식 컨트롤을 업데이트하는 가장 좋은 방법은 무엇입니까?
6
A
답변
10
UI 스레드 자체가 아닌 다른 스레드에서 UI를 업데이트하지 않는다는 일반적인 경험 법칙이 있습니다. BackgroundWorker의 기능을 사용하는 것은 좋은 생각이지만 다른 스레드에서 어떤 일이 일어나고 싶지 않거나 "Invoke"또는 BeginInvoke를 수행하여 델리게이트가 UI 스레드에서 메서드를 실행하도록해야합니다.
편집 : 존 B는 의견이 좋은 지적을했다 :
이 호출은()() 동기 및 BeginInvoke입니다 비동기 있음을 유의하십시오. Invoke()를 사용하는 경우 은 교착 상태가 발생하지 않도록주의해야합니다. 나는 BeginInvoke()가 정말로 필요하지 않다면 추천 할 것이다 동기가되는 호출.
몇 가지 간단한 예제 코드 :
// Updates the textbox text.
private void UpdateText(string text)
{
// Set the textbox text.
m_TextBox.Text = text;
}
public delegate void UpdateTextCallback(string text);
// Then from your thread you can call this...
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText),
new object[]{"Text generated on non-UI thread."});
5
왜 당신은 BackgroundWorker를 사용하여 그것을하고 싶지 않으십니까? ProgressChanged라고하는 환상적인 콜백 이벤트가있어서 UI 스레드가 업데이트에 대해 알 수있게되어 Progess 바 타입 업데이트 등에 적합합니다.
1
1
또한 Invoke를 호출 할 때 InvokeRequired (VS2008에만 해당)를 고려할 것입니다. 별도의 스레드에서 UI를 업데이트하지 않는 경우가 있습니다. 델리게이트 생성 등의 오버 헤드를 줄입니다.
if (InvokeRequired)
{
//This.Invoke added to circumvent cross threading exceptions.
this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage });
}
else
{
UpdateProgressBar(progressPercentage);
}
관련 문제
- 1. 작업자 스레드에서 UI 스레드보기를 업데이트하는 방법
- 2. 별도의 스레드에서 발생하는 예외를 처리하는 가장 좋은 방법은 무엇입니까?
- 3. 코드를 원격으로 업데이트하는 가장 좋은 방법은 무엇입니까?
- 4. 데이터베이스의 목록을 업데이트하는 가장 좋은 방법은 무엇입니까?
- 5. JDBC : 테이블을 업데이트하는 가장 좋은 방법은 무엇입니까?
- 6. 타이머 UI를 업데이트하는 가장 좋은 방법은 무엇입니까
- 7. 스레드에서 폼 컨트롤을 업데이트하는 스레드 불일치
- 8. 런타임에 컨트롤을 대체하는 가장 좋은 방법은 무엇입니까?
- 9. 양식 데이터를 인코딩하는 가장 좋은 방법은 무엇입니까?
- 10. html 양식 개발을위한 가장 좋은 방법은 무엇입니까?
- 11. 자체 스레드에서 연속 프로세스를 실행하는 가장 좋은 방법은 무엇입니까?
- 12. Rails에서 작업자 프로세스를 구성하는 가장 좋은 방법은 무엇입니까?
- 13. gevent와 호환되는 작업자 프로세스 풀을 구현하는 가장 좋은 방법은 무엇입니까?
- 14. CThreadPool에서 작업자 스레드의 오류 정보를 전송하는 가장 좋은 방법은 무엇입니까?
- 15. NSNotifications에 응답 할 때 UIViews를 업데이트하는 가장 좋은 방법은 무엇입니까
- 16. ASP.Net에서 SQL Server로 데이터를 업데이트하는 가장 좋은 방법은 무엇입니까
- 17. performSelectorInBackground 스레드에서 UITextView를 업데이트하는 방법은 무엇입니까?
- 18. 작업자 스레드에서 안전하게 로깅합니까?
- 19. 작업자 스레드에서 MFC 컨트롤에 액세스하는 방법?
- 20. 어떻게 작업자 스레드에서 WebBrowser 컨트롤을 만들고 사용할 수 있습니까?
- 21. iPhone CoreLocation을 별도의 스레드에서 호출하는 가장 좋은 방법은 무엇입니까?
- 22. 가장 좋은 방법은 코드에 대한 주문 양식
- 23. UpdatePanel에서 특정 컨트롤을 업데이트하는 방법은 무엇입니까?
- 24. EF 4에서 변경된 모든 데이터를 업데이트하는 가장 좋은 방법은 무엇입니까?
- 25. 'TranslatePosition'을 Silverlight 베타 2에서 RC로 업데이트하는 가장 좋은 방법은 무엇입니까?
- 26. Eclipse 사용자에게 정기적으로 플러그인을 업데이트하는 가장 좋은 방법은 무엇입니까?
- 27. 테이블의 각 행에 대해 필드를 업데이트하는 가장 좋은 방법은 무엇입니까?
- 28. 파생 정보를 표시/업데이트하는 가장 좋은 방법은 무엇입니까?
- 29. .NET Windows Forms 응용 프로그램을 업데이트하는 가장 좋은 방법은 무엇입니까?
- 30. REST를 통해 구조화 된 리소스를 업데이트하는 가장 좋은 방법은 무엇입니까?
정확히 m_TextBox.Invoke는 무엇을합니까? 델리게이트가 UI 스레드에서 강제로 실행됩니까? – Yttrium
정확히. Invoke()는 동기식이며 BeginInvoke()는 비동기식입니다. Invoke()를 사용하는 경우 교착 상태가 발생하지 않도록주의해야합니다. BeginInvoke()를 사용하면 정말 동기식 호출이 필요하지 않는 한 권하고 싶습니다. –
Jon B. 선생님, 잘 부탁드립니다. 나는 그 요점을 반영하도록 편집 할 것이다. –