Black Squirrel
그는 물었다 12년 전
4

하지만 windows Forms 스레팅 및 이벤트 - ListBox 업데이트뿐 즉시 큰 지연입니다 progressbar 경험을

우리 팀은 신규 채용의 워크플로에 교체할 수 있는 시스템을 만드는 늙은 하나. 저는 그동안 마이그레이션하기 업무를 맡고 있는 오래된 데이터를 into the new 스키마에는. 내가 이렇게 작은 Windows Forms 로 결정한 만들기 프로젝트 및 직선입니다 TSQL 스크립트에만 않습니다를 스키마에는 완전히 다른 적절한 솔루션을 있다.

39, & # 39 주 봉인 클래스가 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);

이 메시지를 전달하는 임포트프로그레스벤트 args 문자열으로 int 값을 최대 진행율 표시줄에는 및 오버클로킹된 현재 진행율 int value. 윈도우 폼 서브크리브스 이벤트:

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

39 의 고유한 이벤트 및 응답하는 사용하여, 이 방법으로 it& 위임합니다:

    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;
            }
        }

이 가지는 ListBox 는 매우 빠르게 움직이는 것 같다, 그러나 결코 업데이트하려면 진행율 표시줄에는 배치처리 때까지 거의 완전한 있겠습니까??? 어떤 보기입니다?

답변 6 개

아마 박그루드워커 컴포넌트를 사용해 볼 수 있습니다. 따라서 스레팅 간편해집니다. 예를 들어 있습니다.

@John

링크 주셔서 감사합니다.

@Will

39, as I know it 는 트레더푸링 there& 얻을 수 있는 거라곤 스폰 스레드할 한 게 전혀 없다. 순수한 마음이 사용할 수 있는 SQL Server 가 있는 동안 눈에 읽기 및 쓰기를 응답성의 ᅴ 있다. # 39 의 스레드할 잠시 존재했었던 it& 분명 아니다.

39 관한 you& 썰매 망치, re right. 하지만 알고보니 내 문제가 사이에서 화면 및 의자 결국. 내가 가지고 있는 것 같아 많은 다른 것보다 더 많은 데이터를 우누살 배치처리 외래 키 레코드전자문서의 배치 및 초기 단계에서 커랑프로그레스 doesn& # 39, 즉 그냥 변화가 발생합니까 프레젠테이션이든 선택함 ++& t get for a good; d # 39 10 초.

@All

주셔서 감사합니다 사용자 입력, 그것은 내가 생각하고 있는 내가 보았으매 다른 코드의 주도한 내 하이 순간 다시 겸손하게 아직 내가 어디 있는지 증명할 오류: 일반적으로 인간:)

Windows Vista 에서 보관합니까 모든 기회를 실행하십시오? # 39, ve i& 것을 정확히 어떤 작동합니까 관련 애플리케이션 (앱) 이 같은 것입니다. 잘은 모르겠지만, 될 때, animates&quot 지연입니다 진행율 표시줄에는 &quot, 여기서 그치지 않는다.

하지만, 가끔 유용하게 사용할 수 있는 범위 밖에 할 수도 있다 ' (),' 대응할 수 있도록 아프리카션.도벤츠 gui 를 누르면 사용자 입력, 부품 등 취소 버튼이 상태 표시줄에는 대화.

&gt. # 39 로 트레더푸링 there& 얻을 수 있는 게 전혀 없다. &gt. 내가 안단말이야 한 판매업체에서 적용할 계획이다. &gt. 어떨까. 순수한 마음이 사용 &gt. 동시에 가지고 응답성의 ᅴ SQL &gt. 서버 눈에 읽고 있는 중입니다. &gt. 쓰기뿐만. # 39 의 짧은 it& 분명 아니다. &gt. 스레드할 살았다.

좋아요, 하지만 당신은 당신의 버그 바라볼 수 있고, 고맙구나 주셔서 정말 감사합니다 박그루드워커? 어떤 일을 하고 있지만, 예쁜 애썼는데요 않니다 you& # 39 의 표준화된 패션 (즉, 자신의 위임 없이) 와 새로 만들 필요 없이 스레드할 - 두 개는 (아마도 여전히 미미하지만 아마 유용한) 의 장점.

Ui 를 실행하고 있는 동안 자유롭게 정말예요 스레드할 진저한테 실행됩니까? 즉, s not it& # 39 에 앉아 참가하십시오 차단 업 또는 다른 진정하라구요? # 39 의 what it looks like that& 다는일은.

이 제안으로 더 강력한 박그루드워커 사용하는 방법 중 하나 - 좋은 인프라일까요 말해둘꼐요 마련을 새로고치기 / 업데이트 하는 문제가 있다.

및 박그루드워커 동작할 수 있는 방법을 사용할 수 있는 풀 (pool) 는 우호적 스레드할 작성하는 것보다 자신의 짧은 어떨까.