c\#winform 다 중 스 레 드 의 작은 예


텍스트 상자 에 숫자 를 입력 하고 시작 누적 단 추 를 누 르 면 프로그램 은 1 부터 이 숫자 에 누 적 된 결 과 를 계산 합 니 다.이 누적 과정 이 오래 걸 리 기 때문에 UI 스 레 드 에서 직접 진행 하면 현재 창 에 가사 가 발생 합 니 다.더 좋 은 사용자 체험 을 위해 프로그램 은 새로운 스 레 드 를 시작 하여 이 계산 을 단독으로 실행 한 다음 200 밀리초 마다 누적 결 과 를 읽 고 결 과 를 텍스트 상자 아래 label 컨트롤 에 표시 합 니 다.또한 프로그램 은 취소 작업 을 지원 합 니 다.누적 취소 단 추 를 누 르 면 누적 작업 을 취소 하고 현재 누적 값 을 label 에 표시 합 니 다.뒤의 설명 을 편리 하 게 하기 위해 서 나 는 UI 스 레 드 를 메 인 스 레 드 라 고 부 르 고 누적 계산 을 실행 하 는 스 레 드 를 작업 자 스 레 드 라 고 부른다.이 과정 은 두 가지 관건 이 있다.
1:작업 자 스 레 드 에서 메 인 스 레 드 가 만 든 컨트롤 에 접근 하 는 방법;
2:비교적 오래 걸 리 는 계산 을 어떻게 취소 합 니까?
작업 자 스 레 드 에서 누적 과정 을 호출 하 는 데 편리 하도록 나 는 그것 을 하나의 단독 방법 으로 썼 다.다음 과 같다.
1:방법 은 CancellationToken 인 자 를 전달 해 야 합 니 다.취소 작업 을 지원 합 니 다('clr via c\#3 버 전'에 서 는 이러한 방식 을 협력 식 취소 라 고 부 릅 니 다.즉,어떤 조작 은 취 소 를 지원 해 야 취소 할 수 있 습 니 다).
2:작업 자 스 레 드 가 메 인 스 레 드 에 접근 할 수 있 도록 만 든 lblStatus 컨트롤,이 스 레 드 에서 this.Invoke 방법 을 사용 합 니 다.이 방법 은 메 인 스 레 드 가 만 든 컨트롤 에 대한 접근 권 을 얻 는 데 사 용 됩 니 다.이 의뢰 는 매개 변수 로 의뢰 가 필요 합 니 다.이 의뢰 에서 우 리 는 lbl 을 정의 할 수 있 습 니 다.Status 의 조작.예 를 들 어 상례 에서 나 는 현재 의 누적 결 과 를 lbl 에 부 여 했 습 니 다.Status 의 Text 속성 입 니 다.
그 다음 에 우 리 는 공 주 된 스 레 드 에서 시간 을 계산 하 는 작업 을 어떻게 수행 하 는 지 살 펴 보 자.즉,'누적 시작'버튼 의 조작 이다

/// <summary>
        /// 1 , CancellationToken
        /// </summary>
        /// <param name="countTo"> </param>
        /// <param name="ct"> </param>
        private void CountTo(int countTo, CancellationToken ct) {
            int sum = 0;
            for (; countTo > 0; countTo--) {
                if (ct.IsCancellationRequested) {
                    break;
                }
                sum += countTo;
                //Invoke lbl_Status
                this.Invoke(new Action(()=>lbl_Status.Text = sum.ToString()));               
                Thread.Sleep(200);
            }
        }
저 는 스 레 드 탱크 스 레 드 를 사용 하여 이 작업 을 수행 합 니 다.스 레 드 탱크 스 레 드 를 사용 하 는 이 유 는 스 레 드 탱크 가 기본적으로 스 레 드 를 만들어 서 새로운 스 레 드 를 만 드 는 데 발생 하 는 열 자원 소 모 를 줄 이 는 동시에 계산 작업 을 완성 한 후에 이 스 레 드 탱크 스 레 드 는 자동 으로 연못 으로 돌아 가 다음 작업 을 기다 리 기 때 문 입 니 다.나 는cts 는 구성원 변수 로 서 다음 과 같이 설명 합 니 다.

private void btn_Count_Click(object sender, EventArgs e)
        {
            _cts = new CancellationTokenSource();
            ThreadPool.QueueUserWorkItem(state=>CountTo(int.Parse(txt_CountTo.Text),_cts.Token));
        }
System.Threading 을 사용 하여 도입 해 야 합 니 다.네 임 스페이스.
취소 작업 이 더 간단 합 니 다.코드 는 다음 과 같 습 니 다.
이렇게 해서 우 리 는 winform 에서 다 중 스 레 드 를 사용 하 는 예 를 완 성 했 고 이 예 는 취소 작업 을 지원 합 니 다.전체 코드 는 다음 과 같 습 니 다:

private CancellationTokenSource _cts;

좋은 웹페이지 즐겨찾기