본문 바로가기

C#

[C#] BackgroundWorker 클래스

우리가 커다란 미술 작품을 만들고 있는데, 혼자서 그림을 그리고 동시에 색칠도 하고, 물감도 섞어야 합니다. 정말 할일이 많죠? 여기서 'BackgroundWorker'는 우리가 그림을 그리는 동안, 친구가 배경을 색칠해주고 물감을 섞어주는 것입니다. 우리는 큰 그림에 집중할 수 있고, 친구는 우리를 도와서 다른 일들을 하죠. 이렇게 함께 일하면, 더 빨리 멋진 작품을 완성할 수 있습니다.


이제, 이 친구를 컴퓨터 안에서 일하는 작은 도우미로 바꿔볼까요? 컴퓨터가 큰 일을 하고 있을 때, 'BackgroundWorker'는 다른 작은 일들을 배경에서 처리해줘요. 그래서 컴퓨터가 한 가지 일에만 집중하지 않고, 여러 가지 일을 동시에 할 수 있게 되죠. 우리가 비디오 게임을 하면서 음악을 듣는 것처럼 말이죠!

 

이제 'BackgroundWorker'에 대해서 조금 더 자세히 알아볼게요!

 

'BackgroundWorker'는 .NET 프레임워크에서 제공하는 컴포넌트로, 다중 스레딩을 쉽게 구현할 수 있도록 도와줍니다. 이를 사용하면 사용자 인터페이스(UI)를 차단하지 않고 시간이 많이 걸리는 작업을 백그라운드에서 실행할 수 있습니다. 즉, 애플리케이션의 반응성을 유지하면서 긴 작업을 처리할 수 있게 해줍니다.


'BackgroundWorker'는 다음과 같은 주요 이벤트와 속성들을 제공합니다:

* DoWork: 백그라운드 스레드에서 실행할 코드를 여기에 배치합니다.
* RunWorkerCompleted: 백그라운드 작업이 완료되었을 때 실행될 코드를 정의합니다.
* ProgressChanged: 작업의 진행 상태를 보고할 때 사용됩니다. 이 이벤트를 사용하려면 WorkerReportsProgress 속성을 true로 설정해야 합니다.
* WorkerReportsProgress: 진행 상태 업데이트를 활성화할지 여부를 결정합니다.
* WorkerSupportsCancellation: 작업의 취소를 지원할지 여부를 결정합니다.

* IsBusy: BackgroundWorker가 비동기 작업을 실행하고 있는지 여부를 나타내는 값을 가져옵니다.

 

C#에서 BackgroundWorker를 사용하는 기본적인 방법은 다음과 같습니다:

1. BackgroundWorker 인스턴스를 생성하고, 필요한 이벤트 핸들러를 연결합니다.
2. DoWork 이벤트 핸들러 내에서 시간이 많이 걸리는 작업을 실행합니다.
3. RunWorkerCompleted 이벤트 핸들러에서 작업 완료 후의 처리를 합니다.
4. 필요에 따라 ProgressChanged 이벤트를 통해 작업 진행 상태를 UI에 업데이트합니다.
5. RunWorkerAsync() 메서드를 호출하여 백그라운드 작업을 시작합니다.

 

using System;
using System.ComponentModel;
using System.Threading;

public class Example
{
    private BackgroundWorker backgroundWorker = new BackgroundWorker();

    public Example()
    {
        backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
        backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
        backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker_ProgressChanged);
        backgroundWorker.WorkerReportsProgress = true;
        backgroundWorker.WorkerSupportsCancellation = true;
    }

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // 시간이 많이 걸리는 작업 여기에 실행
        for (int i = 0; i <= 100; i++)
        {
            Thread.Sleep(50); // 예제를 위한 지연
            backgroundWorker.ReportProgress(i);
        }
    }

    private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Console.WriteLine("작업 완료!");
    }

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        Console.WriteLine($"진행 상태: {e.ProgressPercentage}%");
    }

    public void StartWork()
    {
        if (!backgroundWorker.IsBusy)
        {
            backgroundWorker.RunWorkerAsync();
        }
    }
}

 

이 코드는 BackgroundWorker를 사용하여 백그라운드에서 작업을 수행하고, 작업의 진행 상태를 보고하며, 작업이 완료되었을 때 알림을 받는 방법을 보여줍니다.

 

<추가자료> 

https://learn.microsoft.com/ko-kr/dotnet/api/system.componentmodel.backgroundworker?view=net-8.0

'C#' 카테고리의 다른 글

[C#] 프로젝트 참조와 싱글톤 패턴의 차이  (0) 2024.06.02
[C#] Partial 메소드 란?  (0) 2024.05.09
[C#] init 접근자 란?  (2) 2024.05.07
[C#] BackgroundWorker와 Thread 차이  (0) 2024.04.17
[C#] Sealed 클래스  (0) 2024.04.15