프로젝트에서 어떤 파일을 복사하거나, 어떤 업무 처리를 연속적으로 처리하거나, 또는 다른 서버로 정보를 전달하여야 하는 경우와 같이 시간이 소비되는 작업에서는 사용자에게 작업의 단계별 진행을 알려주어야 하는 경우가 많다.
보통은 UI Thread에서 대 부분의 작업을 진행하므로 별다른 문제가 없지만, 작업이 길고, 다량의 작업이 된다면 Thread가 먹통(?)이 되기 때문에 ProgressBar 에 진척 사항이 보여질 수가 없다. 즉 작업을 동기적으로 처리하게되면 Wait 상태가 되기 때문이다.
이런 경우는 대상 작업을 별도의 Thread로 분리해서 운영을 하여야 한다. 즉, UI Thread 가 Busy 상태로 빠지지 않게 하는 것이다.
이런 작업을 위한 부분이 아래와 같이 BackgroundWorker를 이용하는 것이다. (물론 Thread를 생성해서 처리를 해도 된다.)
다음은 대략적인 개념을 알 수 있는 샘플이다.
public partial class Form1 : Form {
#region Fields
private BackgroundWorker worker;
#endregion
#region Constructors
public Form1() {
InitializeComponent();
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
// 실제 작업 메서드 연결
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
// 진행 상황 처리 메서드 연결
worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
// 작업 완료 처리 메서드 연결
worker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
#endregion
#region Event Handlers
// Worker Thread가 실제 하는 일
void worker_DoWork(object sender, DoWorkEventArgs e) {
// 실제 처리 작업
foreach(…) {
…
// 진행상황 처리
worker.ReportProgress(percent);
}
}
// Progress 진행 상황
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) {
this.progressBar1.Value = e.ProgressPercentage;
}
// 작업 완료
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
// 에러 검증
if (e.Error != null) {
lblMsg.Text = e.Error.Message;
MessageBox.Show(e.Error.Message, “Error”);
return;
}
lblMsg.Text = “완료되었습니다”;
}
private void btnRun_Click(object sender, EventArgs e) {
worker.RunWorkerAsync(); // 비동기(Async)로 실행
}
#endregion
}
가장 중요한 부분은 UI Thread 와 분리해서 비 동기 처리 (BackgroundWorder or Thread) 를 해야 한다는 점이다.
얼마 전에 어떤 회사에 인터뷰를 하러 간 적이 있었다. 당시 그 회사는 자체 솔루션을 개발할 기술인력을 찾고 있었고 내부적으로 OData를 사용한다고 했다. 좀 창피한 이야기일 수도 있지만 나름 기술적인 부분에서는 많은 정보를 가지고 있다고 했던 것이 무색하게 OData란 단어를 그 회사 사장님에게서 처음 들었다. 작고, 단순한 사이트들만을 계속해서 작업을 하다 보니 어느덧 큰 줄기들을 잃어버린 것을 느끼기 시작했다. 명색이 개발이 좋고, 기술적인 기반을 만들려고 하는 인간이 단어조차도 모른다는 것은 있을 수 없는 것이라서 다시 새로운 단어들과 개념들을 알아보는 시간을 가지려고 한다. OData (Open Data Protocol) 란? 간단히 정리하면 웹 상에서 손쉽게 데이터를 조회하거나 수정할 수 있도록 주고 받는 웹(프로토콜)을 말한다. 서비스 제공자 입장에서는 웹으로 데이터를 제공하는 방식으로 각 포탈 사이트들이 제공하는 OPEN API 포맷을 독자적인 형식이 아니라 오픈된 공통규약으로 제공 가능하며, 개발자는 이 정보를 다양한 언어의 클라이언트 라이브러리로 어플리케이션에서 소비할 수 있도록 사용하면 된다. 공식 사이트는 www.odata.org 이며 많은 언어들을 지원하고 있다. 좀더 상세하게 정의를 해 보면 OData는 Atom Publishing Protocol (RFC4287) 의 확장 형식이고 REST (REpresentational State Transfer) Protocol 이다. 따라서 웹 브라우저에서 OData 서비스로 노출된 데이터를 볼 수 있다. 그리고 AtomPub 의 확장이라고 했듯이 데이터의 조회만으로 한정되는 것이 아니라 CRUD 작업이 모두 가능하다. Example 웹 브라우저에서 http://services.odata.org/website/odata.svc 를 열어 보도록 하자. This XML file does not appear to have any style in...
댓글
댓글 쓰기