티스토리 뷰
BackgroundWorker 클래스
- BackgroundWorker 클래스는 별도의 쓰레드에게 어떠한 일들을 시키기 위해 사용하는 클래스로 다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 걸리는 작업이 실행되는 동안에는 UI가 응답을 중지하는 것처럼 보일 수 있다. 그래서 UI 쓰레드와는 별도로 BackgroundWorker 쓰레드를 이용하면 별도로 작업들 수행할 수 있습니다.
1. DoWorker 이벤트
- 작업할 내용을 지정하는 이벤트입니다.
- 작업을 시작하려면 RunWorkerAsync를 호출합니다.
- Dowork 이벤트 처리기에서 UI개체를 조작하지 않도록 주의한다.
- ProgressChanged 및 RunWorkerAsync를 통해 UI와 통신합니다.
2. ProgressChanged 이벤트
- DoWorker의 진행률 사항을 알려줍니다.
3. RunWorkerCompleted 이벤트
- 작업 완료를 알리는 이벤트입니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BackgroundWorker
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
struct DataParameter
{
public int Process;
public int Delay;
}
private DataParameter inputParameter;
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = string.Format("처리중 ...... {0}%", e.ProgressPercentage);
progressBar1.Update();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int process = ((DataParameter)e.Argument).Process;
int delay = ((DataParameter)e.Argument).Delay;
int index = 1;
try
{
for(int i = 0; i < process; i++)
{
if (!backgroundWorker1.CancellationPending)
{
backgroundWorker1.ReportProgress(index++ * 100 / process, string.Format("처리 데이터 {0}", i));
Thread.Sleep(delay); // 작동 시간을 시뮬레이션하는 데 사용
// 여기에 코드를 추가하십시오 ...
}
}
}
catch(Exception ex)
{
backgroundWorker1.CancelAsync();
MessageBox.Show(ex.Message, "메시지", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("처리 완료", "메시지", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnStart_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
{
inputParameter.Delay = 10;
inputParameter.Process = 1200;
backgroundWorker1.RunWorkerAsync(inputParameter);
}
}
private void btnStop_Click(object sender, EventArgs e)
{
if (backgroundWorker1.IsBusy)
backgroundWorker1.CancelAsync();
}
}
}
'프로그래밍 > C#' 카테고리의 다른 글
c# 동적으로 버튼 생성하고 그 버튼으로 메시지 박스 띄우기 (0) | 2021.11.24 |
---|---|
C# 실시간으로 숫자 카운트하기 (0) | 2021.11.22 |
C#에서 콘솔 응용 프로그램을 숨기는 방법 (0) | 2021.09.24 |
C# 윈폼 숨기는 방법 코드 (0) | 2021.09.24 |
C# 텍스트 읽어주기 소스코드 (0) | 2021.09.24 |
댓글