2011-03-12 2 views
0

파일을 검색하고 일치하는 파일 이름을 DataGridView에 추가하는 백그라운드 스레드를 만드는 Windows Forms 응용 프로그램이 있습니다. 백그라운드 스레드는 BeginInvoke를 사용하여 DataGridView에 행을 추가하고 백그라운드 스레드가 수천 개의 결과를 반환하지 않으면 모든 것이 올바르게 작동합니다. UI가 DataGridView에 수천 개의 행을 시도하지 않는 한 백그라운드 스레드가 수천 개의 파일을 처리하더라도 완벽하게 작동합니다.수천 개의 행을 추가하는 동안 응용 프로그램이 응답하지 않는다

하나씩 행을 추가하고 버퍼링하고 한 번에 100 개의 행을 추가하려고했습니다. 그러나 애플리케이션 UI는 항상 응답하지 않습니다. 백그라운드 프로세스는 UI 스레드보다 빠르게 작동하며 항상 DataGridView에 추가 할 새 행이 있습니다.

(UI 스레드에서) Application.DoEvents를 시도 했는데도 도움이되지 않았습니다.

아이디어가 있으십니까? 백그라운드 스레드에 지연을 추가하지 않고도 문제를 해결할 수 있습니까? 사전

+2

BGW에서 결과를 표시하는 데 UI가 표시하는 속도보다 빠른 속도가 무엇입니까? 아니면 사용자가 읽을 수 있습니까? 당신은 이익없이 기억을 낭비하고 있습니다. –

답변

2

BeginInvoke 대신 Invoke를 사용하여 행을 추가하는 것이 가장 쉬운 방법입니다. 백그라운드 스레드가 조금 느려지지만 UI가 응답하지 않게됩니다. 배경 스레드에 미리 정의 된 지연을 추가하지 않기 때문에 UI 스레드를 따라 잡을 수 있도록 백그라운드 스레드를 느리게하는 것이 허용 될 수 있다고 생각합니다. SuspendLayout 및 ResumeLayout을 사용하면 BeginInvoke를 사용하는 동안 도움이되지 않았습니다. 공유 행이있는 가상 모드를 아직 시도하지 않았지만 도움이 될 수 있습니다.

+0

흥미 롭습니다. 나는 그것을 생각하지 않았을 것이다. (사실, 나는 BeginInvoke의 파급 효과를 처리하지 않았다.) 그러나 당신이 그것을 말할 때 그것은 완벽하게 이해됩니다. –

0

한 가지 방법은 메인 스레드는 백그라운드 스레드가 문자열을 추가 할 수있는 큐 역할을하는 BlockingCollection<string>을 만들도록하는 것입니다. 백그라운드 스레드가 추가를 완료하면 CompleteAdding을 호출합니다.

UI 스레드는 또한 일부 주파수에서 발생하는 타이머를 만듭니다 (실험적으로 결정했을 수도 있음). 타이머의 Elapsed 이벤트는 대기열에 항목이 있는지 살펴보고 항목이 하나 인 경우이를 제거하고 DataGridView에 추가합니다. 타이머의 Elapsed 이벤트에서 큐의 IsComplete 속성이 True 인 것으로 확인되면 타이머를 중지하고 처리합니다.

타이머를 제공하면 너무 빨리 처리되지 않으므로 UI가 반응을 유지해야하며 백그라운드 스레드에 지연을 추가 할 필요가 없습니다.

+0

BeginInvoke 대신 Control.Invoke를 사용하면 훨씬 쉽게 같은 작업을 수행 할 수 있습니다. –

2

새 행을 모두 추가하기 전후에 각각 SuspendLayout()ResumeLayout()으로 전화하십시오. 모든 행을 추가하기 전에 SuspendLayout을 호출하지 않으면 DataGridView이 추가 된 각 행 다음에 다시 칠하기 때문에 약간 느려집니다.

0

문제의 형태는 10000 행처럼 말하면서 행이 추가 될 때마다 스크롤바가 다시 그려지는 것처럼 보였습니다. 데이터를 채우기 전에 DataGridview의 스크롤 막대를 None으로 설정하고 다음과 같이 채워진 후 복원하여이 문제를 해결했습니다.

ScrollBars bars = this.ScrollBars; this.ScrollBars = System.Windows.Forms.ScrollBars.None;

(내가 오버라이드 (override) DataGridView 컨트롤이) 여기

이 채 웁니다.ScrollBars = bars;

수천 개의 행을 추가하는 경우 SuspendLayout이 작동하지 않습니다.

관련 문제