윈도우 폼이 스레딩 및 이벤트-ListBox 업데이트를 신속하지만 형 경험대 지연

StackOverflow https://stackoverflow.com/questions/12095

문제

우리의 팀은 새로 만드는 모집 워크플로우 시스템을 대체하는 오래된 하나입니다.나는 임무를 마이그레이션 오래된 데이터로 새로운 스키마.기로 결정했을 이렇게 만들어 작은 윈도우 폼 프로젝트로 스키마는 근본적으로 다른 직 TSQL 스크립트는지 적절한 솔루션입니다.

주 밀봉된 클래스'ImportController'작업을 수행하는 선언 다음과 같은 대리인 이벤트:

public delegate void ImportProgressEventHandler(object sender, ImportProgressEventArgs e);
public static event ImportProgressEventHandler importProgressEvent;

메인 창작 정적 방법에 해당 클래스를 사용하여 새로운 스레드:

Thread dataProcessingThread = new Thread(new ParameterizedThreadStart(ImportController.ImportData));
dataProcessingThread.Name = "Data Importer: Data Processing Thread";
dataProcessingThread.Start(settings);

이 ImportProgressEvent args 운반 문자열은 메시지,max int 가치 있는 진전을 위해 바와 있는 현재 진행 int value.Windows form subcribes 이벤트:

ImportController.importProgressEvent += new ImportController.ImportProgressEventHandler(ImportController_importProgressEvent);

및 이벤트에 응답하면서 이를 사용하는 방식으로 그것의 자신의 대리인:

    private delegate void TaskCompletedUIDelegate(string completedTask, int currentProgress, int progressMax);

private void ImportController_importProgressEvent(object sender, ImportProgressEventArgs e)
            {
                this.Invoke(new TaskCompletedUIDelegate(this.DisplayCompletedTask), e.CompletedTask, e.CurrentProgress, e.ProgressMax);
            }

마지막으로 진행 표시줄 및 listbox 업데이트:

private void DisplayCompletedTask(string completedTask, int currentProgress, int progressMax)
        {
            string[] items = completedTask.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string item in items)
            {
                this.lstTasks.Items.Add(item);
            }

            if (currentProgress >= 0 && progressMax > 0 && currentProgress <= progressMax)
            {
                this.ImportProgressBar.Maximum = progressMax;
                this.ImportProgressBar.Value = currentProgress;
            }
        }

일 목록 상자인은 매우 빠르게 업데이트이지만,진행됩 결코 움직임까지 배치 거의 완료까요???어떤 장점이 있나요?

도움이 되었습니까?

해결책 4

@John

감사에 대한 링크입니다.

@이

거기에 아무에서 얻는 threadpooling 으로 나는 그것을 알고있을 것이 오직 스폰 하나의 스레드가 있습니다.용되는 스레드가 순수하게 반응하 UI 면서 SQL 서버를 두드리고 함께 읽기 및 쓰기.그것은 확실히지 않은 짧은 살았다.

에 관한 썰매를 망치는 당신이 맞습니다.하지만,그것은 밝혀 나의 문제이고 자 한다.나는 것 같다닌데 일괄 처리하는 데이터는 많은 많은 많은 외국인 핵심 기록보다는 다른 일괄 처리 및을 얻을 선택한 프로세스의 초기에 의미하는 currentProgress 지 않++'d 에 대한 좋은 10 초입니다.

든@

자세한 내용은 당사의 입력,그것을 가지고 나를 생각하는,나를 찾는 다른 코드를 주도하는 내 ali 순간 겸손의 어디에 내가 증명해 아직 다시 오류가 일반적으로 인간의:)

다른 팁

어쩌면 당신이 시도할 수 있습 BackgroundWorker 구성 요소입니다.그것은 스레딩을 쉽습니다.예로 여기:

어쩌면의 범위 밖이지만,때때로 유용한지 Application.DoEvents(); 을 gui 부분 반응하는 사용자 입력,같은 눌러서 취소버튼에 상태 표시줄을 대화.

당신이 어떤 기회에 의해 실행 Windows Vista?나는 것으로 나타났 정확히 같은 것은 어떤 일에 관련 응용 프로그램이 있습니다.어떻게 든가 될 것 같은 경우 지연 진행"바이 애니메이션".

당신은지 확인하는 UI 스레드는 실행 자유롭게하는 동안 모든 과정은?즉그것은 앉아 있지 막에 가입하거나 일부 다른 기다릴까요?는 것처럼 보인다.

의 제안을 사용하여 BackgroundWorker 은 좋은 하나 확실히 우수하려는 썰매-해머의 방법 문제의 부하와 함께 새로고침/업데이트를 호출합니다.

고 BackgroundWorker 이용 수영장,스레드는 더 친절한 방법으로 행동하는 만드는 것보다 당신의 자신의 짧은 스레드가 있습니다.

거기에 아무에서 얻는 threadpooling 로 나는 그것을 알고있을 것이 오직 스폰나 스레드가 있습니다.의 사용은 순전히 실 을 응용 프로그램 동안에는 SQL 서버를 두드리고 함께 읽고 기록합니다.그것은 확실히 짧 살았다.

OK,나는 감사하는 것,그리고 다행 당신은 당신의 버그,하지만 당신은 보 BackgroundWorker?그것은 꽤 많은 정확히 무엇을 하고 있지만,표준화된 방식으로(즉없이 당신의 자신의 대리자)및 만들 필요 없이 새로운 스레드는 모두(아마도 작은,하지만 아마도 여전히 유용)장점이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top