WPF UI 안멈추게 하기

2022. 6. 18. 13:22코딩/C#

wpf를 만들면서 ui 상호작용 함수들에 코드를 다 때려박으면 작업하는동안 wpf윈도우가 통채로 멈춰버린다.

멀티스레딩, 디스패처 등을 통해 해결할수 있으며 간단하게 아래 코드메모 참조

 

        private BackgroundWorker myThread = new BackgroundWorker()
        {
            WorkerReportsProgress = true,
            WorkerSupportsCancellation = true
        };
        
        protected override void OnInitialized(EventArgs e)
        {
            base.OnInitialized(e);


            //백그라운드로 작업할 메소드
            myThread.DoWork += myThread_DoWork;
            //UI쪽에 진행사항을 보여주기 위한 메소드
            myThread.ProgressChanged += myThread_ProgressChanged;
            //작업이 완료되었을 때 실행할 메소드
            myThread.RunWorkerCompleted += myThread_RunWorkerCompleted;

        }
        
        private void myThread_DoWork(object? sender, DoWorkEventArgs e)
        {
        	//여기에서 백그라운드로 작업할 코드 작성
            // 캔슬이벤트 발생시 중단
            if (myThread.CancellationPending) { e.Cancel = true; return; }
            
            //작업진행중 프로그레스 보고
            //예) myThread.ReportProgress(i);
        }
        
        private void myThread_RunWorkerCompleted(object? sender, RunWorkerCompletedEventArgs e)
        {
        	//백그라운드작업이 끝나고 수행할 작업 작성
            
        }
        
        private void myThread_ProgressChanged(object? sender, DoWorkEventArgs e)
        {
        	//여기에서 프로그레스ui 업데이트 작성
            progressBar.Value = e.ProgressPercentage;
        }
        
        private void BTsearch_Click(object sender, RoutedEventArgs e)
        {
			//프로그레스바의 100%값 입력
            progressBar.Maximum = num;

            //백그라운드 워커 진입점
            myThread.RunWorkerAsync();
        }

 

혹시 DoWork 안에서 바로바로 UI에 접근하고 싶다면 Dispatcher를 이용하면 접근할 수 있다.

this.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
            (ThreadStart)delegate ()
            {
                //UI접근 코드
            }
            );