반응형

BackgroundWorker 클래스를 사용 하면 별도 전용 스레드에서 작업을 실행할 수 있습니다. 다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 걸리는 작업은 사용자 인터페이스 (UI) 실행 하 고 응답을 멈춘 것 처럼 보일 수 발생할 수 있습니다. 이러한 작업으로 인 한 지연이 길어지는 경우 및 응답성이 뛰어난 UI를 구성할 때의 BackgroundWorker 클래스는 편리 하 게 솔루션을 제공 합니다.

시간이 많이 걸리는 작업을 백그라운드에서를 실행 하려면 만들기를 BackgroundWorker 작업이 완료 되 면 신호 확인 하 고 작업의 진행률을 보고 하는 이벤트를 수신 합니다. 만들 수 있습니다는 BackgroundWorker 프로그래밍 방식으로에서 폼으로 끌어 놓을 수 있습니다 합니다 구성 요소 탭의 도구 상자. 만드는 경우는 BackgroundWorker Windows Forms 디자이너에서 구성 요소 트레이에 표시 됩니다 하 고 해당 속성이 속성 창에 표시 됩니다.

백그라운드 작업에 대 한 설정에 대 한 이벤트 처리기를 추가 합니다 DoWork 이벤트입니다. 이 이벤트 처리기에서 시간이 오래 걸리는 작업을 호출 합니다. 작업을 시작 하려면 호출 RunWorkerAsync합니다. 진행률 업데이트의 알림을 받으려면 처리는 ProgressChanged 이벤트입니다. 작업이 완료 될 때 알림을 받으려면 처리는 RunWorkerCompleted 이벤트입니다.

Background Worker 속성
BackgroundWorker 이벤트

예제

다음 코드 예제는 기본 사항을 보여줍니다는 BackgroundWorker 시간이 많이 걸리는 작업을 비동기적으로 실행 하기 위한 클래스입니다. 다음 그림에서는 출력의 예를 보여 줍니다.

이 코드를 실행 하려면 Windows Forms 애플리케이션을 작성 합니다. 추가 Label 라는 컨트롤 resultLabel 두 개의 추가 Button 컨트롤 이라는 startAsyncButton  cancelAsyncButton합니다. 만들 Click 두 단추에 대 한 이벤트 처리기입니다. 구성 요소 탭 도구 상자의 추가 BackgroundWorker 라는 구성 요소 backgroundWorker1합니다. 만들 DoWork, ProgressChanged, 및 RunWorkerCompleted 에 대 한 이벤트 처리기는 BackgroundWorker합니다. 폼의 코드에서 기존 코드를 다음 코드로 바꿉니다.

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace BackgroundWorkerSimple
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        private void startAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void cancelAsyncButton_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
            }
        }

        // This event handler is where the time-consuming work is done.
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;

            for (int i = 1; i <= 10; i++)
            {
                if (worker.CancellationPending == true)
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    // Perform a time consuming operation and report progress.
                    System.Threading.Thread.Sleep(500);
                    worker.ReportProgress(i * 10);
                }
            }
        }

        // This event handler updates the progress.
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            resultLabel.Text = (e.ProgressPercentage.ToString() + "%");
        }

        // This event handler deals with the results of the background operation.
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {
                resultLabel.Text = "Canceled!";
            }
            else if (e.Error != null)
            {
                resultLabel.Text = "Error: " + e.Error.Message;
            }
            else
            {
                resultLabel.Text = "Done!";
            }
        }
    }
}

 

*참고 : https://docs.microsoft.com/ko-kr/dotnet/api/system.componentmodel.backgroundworker?view=netframework-4.8

반응형

+ Recent posts