이번 포스팅은 C# 개발자로 근무하며 BackgroundWorker 클래스를 사용하면서 배운 점을 정리했습니다.
C# 개발을 하며 중요한 기능 중 하나가 프로그램이 실행하는 동안 백그라운드에서 코드를 실행하는 기능입니다.
이는 BackgroubdWorker 클래스를 사용하여 가능한데요 간단한 예시를 통해 알아보겠습니다.
| 1. BackgroundWorker 클래스란?
- BackgroundWorker 클래스 C#의 Windows Form의 백그라운드에서 작업을 수행할 수 있습니다. 즉, 백그라운드에서 작업이 실행되는 동안 UI 응답성을 유지할 수 있다는 뜻입니다. 파일 업로드, 데이터 처리와 같은 작업을 수행할 때 유용하게 사용할 수 있습니다. C#에서 BackgroundWorker 클래스를 사용하려면 BackgroundWorker 클래스의 인스턴스를 만든 다음 필요에 따라 속성과 이벤트 처리기를 설정해야 합니다.
- BackgroundWorker 클래스의 중요한 속성은 WorkerReportsProgress 및 WorkerSupportsCancellation 속성입니다.
WorkerReportsProgress 속성을 사용하면 작업자가 기본 양식에 진행 상황을 보고할 수 있고 WorkerSupportsCancellation 속성을 사용하면 사용자가 작업자를 취소할 수 있습니다.
속성이 설정되면 RunWorkerAsync 메서드를 호출하여 백그라운드 작업을 실행할 수 있습니다. 이 메서드는 별도의 스레드에서 백그라운드 작업을 시작하여 사용자 인터페이스가 계속 응답할 수 있도록 합니다.
마지막으로 백그라운드 작업이 완료되면 RunWorkerCompleted 이벤트가 발생합니다.
예시를 보고 다시 보시면 이해가 더욱 쉬울 것 같습니다.
예시)
using System.ComponentModel;
using System.Windows.Forms;
namespace ExampleApplication
{
public partial class MainForm : Form
{
private BackgroundWorker backgroundWorker;
public MainForm()
{
InitializeComponent();
// Create a new instance of the BackgroundWorker class
backgroundWorker = new BackgroundWorker();
// Set the WorkerReportsProgress property to true so that progress can be reported to the main form
backgroundWorker.WorkerReportsProgress = true;
// Set the WorkerSupportsCancellation property to true so that the user can cancel the background operation
backgroundWorker.WorkerSupportsCancellation = true;
// Register event handlers for the BackgroundWorker events
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
}
}
}
- 예제에서 기본 양식은 BackgroundWorker 클래스의 인스턴스를 만드는 것입니다.
WorkerReportsProgress, WorkerSupportsCancellation의 속성을 true로 설정하고 DoWork, RunWorkerCompleted 이벤트에 대한 이벤트 핸들러를 만듭니다. BackgroundWorker 개체의 CancellationPending 속성을 확인하여 취소 요청을 확인합니다.
- DoWork 이벤트는 사실 BackgroundWorker의 실제 동작을 정의하는 이벤트입니다. 실제로 가장 많이 사용하기도 했고 DoWork에서 정의해 놓은 다른 함수나 기능들이 BackgroundWorker를 통해 실행되게 만드는 것입니다.
- RunWorkerCompleted 이벤트 처리기에서 백그라운드 작업이 취소되었는지 또는 오류가 발생했는지 확인합니다. 또한 기본 폼의 레이블 컨트롤에 백그라운드 작업의 결과를 표시합니다.
계속해서 적고 있지만 BackgroundWorker 클래스는 개발자가 UI 스레드와 별도로 스레드에서 작업을 실행할 수 있게 도와주는 클래스입니다. C#을 개발하고 있다고 한다면 BackgroundWorker를 잘 사용하시면 UI와 별개로 여러 가지 작업을 실행할 수 있게 할 수 있습니다.
| 2. 취소 요청 처리
- 앞서 속성 중 중요한 설정인 CancellationPending에 대해 간략하게 설명 했습니다. CancellationPending는 사용자의 취소 요청을 처리하기 위해 사용하는 것이며 예시를 통해 자세하게 알아보겠습니다.
되는 시간 소모적인 작업이 있습니다. 우리는 ReportProgress 메서드를 사용하여 기본 사용자 인터페이스 스레드에 진행률을 다시 보고합니다. 또한 기본 사용자 인터페이스 스레드에서 진행률 표시줄 컨트롤을 업데이트하는 ProgressChanged 이벤트에 대한 이벤트 처리기도 있습니다.
예시)
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
// Check for cancellation request
if (backgroundWorker.CancellationPending)
{
e.Cancel = true;
return;
}
// Perform a time-consuming operation
DoSomething();
}
}
private void buttonCancel_Click(object sender, EventArgs e)
{
// Cancel the background operation
backgroundWorker.CancelAsync();
}
- UI의 버튼 클릭 시 백그라운드 작업을 취소하는 버튼을 만들고 클릭 시 CancelAsync() 메서드를 실행합니다. DoWork에서 CancellationPending의 상태를 보고 취소 요청을 확인하고 DoWork 메서드를 종료할 수 있습니다.
| 3. 결과 표시
- UI에서 백그라운드의 결과를 표시하려면 RunWorkerCompletedEventArgs의 Result 속성을 사용할 수 있습니다.
예시를 통해 자세하게 알아보겠습니다.
예시)
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Perform a time-consuming operation and set the result
e.Result = DoSomething();
}
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
// Handle cancellation
}
else if (e.Error != null)
{
// Handle error
}
else
{
// Display result on the main user interface thread
textBoxResult.Text = e.Result.ToString();
}
}
- Result 속성을 통해 BackgroundWorker의 결과를 알 수 있고 실제로 여러 상황에서 사용할 수 있습니다.
이번 포스팅은 제가 개발을 하면서 많이 사용했던 BackgroundWorker에 대해 정리했습니다.
개인적인 생각으로는 C#에서 가장 강력한 기능 중 하나가 아닌가 생각합니다. 스레드를 돌리면서 UI를 사용할 수 있게 해 주며 간단하게 사용할 수 있기 때문인데요.
여러분도 C# 프로젝트를 진행하면서 BackgroundWokrer를 활용하며 진행한다면 더욱 다양한 프로젝트를 구상하고 실행할 수 있을 것 같습니다!
다음 포스팅으로 찾아오겠습니다.
감사합니다 :)
'C#' 카테고리의 다른 글
[C#] Bitmap.LockBits 메서드 (0) | 2023.09.25 |
---|---|
[C#] unsafe / fixed 키워드 (0) | 2023.09.25 |
[C#] record(레코드) 정의와 사용 (0) | 2023.09.24 |
[C#] delegate(대리자) 마스터하기 (1) (0) | 2023.07.17 |
[C#] 파일 존재 유무 확인 하는 3가지 방법 (0) | 2023.04.17 |