BackgroundWorker 클래스
를사용하면 별도의 전용 스레드에서 작업을 실행할 수 있습니다.
다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 걸리는 작업이 실행되는 동안에는 사용자 인터페이스가 응답을 중지할 수 있습니다.
응답성이 뛰어난 사용자 인터페이스가 필요하고 시간이 많이 걸리는 작업을 수행해야 하는 경우 BackgroundWorker 클래스는 간편한 해결책을 제공합니다.
백그라운드에서 작업을 실행하려면 BackgroundWorker를 만듭니다.
그런 다음 작업 진행률을 보고하고 작업이 완료되면 신호를 보내는 이벤트를 수신할 수 있습니다.
백그라운드 작업을 설정하려면 DoWork 이벤트의 이벤트 처리기를 추가한 다음 이 이벤트 처리기에서 시간이 많이 걸리는 작업을 호출합니다. 백그라운드 작업을 시작하려면 RunWorkerAsync 메서드를 호출합니다. 진행률 업데이트에 대한 알림을 받으려면 ProgressChanged 이벤트를 처리합니다.
작업이 완료될 때 알림을 받으려면 RunWorkerCompleted 이벤트를 처리합니다.
<UserControl x:Class="SL_BackgroundWorker_CS.Page" xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="400" Height="300"> <Grid x:Name="LayoutRoot" Background="White"> <StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10" > <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click" Width="80" Height="30"/> <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click" Width="80" Height="30"/> </StackPanel> <StackPanel Margin="10,50,0,0" Orientation="Horizontal"> <TextBlock Text="Progress: "/> <TextBlock x:Name="tbProgress"/> </StackPanel> </Grid> </UserControl>
-----------------------------------------------------------------------------------------
cs 코드
using System.ComponentModel; using System.Windows; using System.Windows.Controls; namespace SL_BackgroundWorker_CS { public partial class Page : UserControl { private BackgroundWorker bw = new BackgroundWorker(); public Page() { InitializeComponent(); bw.WorkerReportsProgress = true; bw.WorkerSupportsCancellation = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); } private void buttonStart_Click(object sender, RoutedEventArgs e) { if (bw.IsBusy != true) { bw.RunWorkerAsync(); } } private void buttonCancel_Click(object sender, RoutedEventArgs e) { if (bw.WorkerSupportsCancellation == true) { bw.CancelAsync(); } } private void bw_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)); } } } private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if ((e.Cancelled == true)) { this.tbProgress.Text = "Canceled!"; } else if (!(e.Error == null)) { this.tbProgress.Text = ("Error: " + e.Error.Message); } else { this.tbProgress.Text = "Done!"; } } private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%"); } } }
'C#.NET' 카테고리의 다른 글
[web.Config &구성 검색] DB접속 연결자 등록해놓고 사용하기 (0) | 2009.12.08 |
---|---|
[Using Data Contracts]wcf로 클래스 데이터 주고 받기 (0) | 2009.12.07 |
[Entity Framework]엔티티 프레임워크 데이터작업 (0) | 2009.12.03 |
DataGridView (추가중…) (0) | 2009.12.02 |
'System.Data.Common.DataRecordInternal' 형식 개체를 'System.Data.DataRowView' 형식으로 캐스팅할 수 없습니다. (0) | 2009.12.02 |
쉐어포인트를 이용한 프로젝트 관리 (0) | 2009.12.01 |
Windows Server 2008용 Windows Media 서비스 2008 (0) | 2009.12.01 |
Ajax Toolkit 을 이용한 실시간 (페이지 전환없이) 파일업로드 구현하기 (2) | 2009.12.01 |
WCF 웹서비스를 이용한 데이터 바인딩 (0) | 2009.12.01 |
(웹서비스 최소용량 해결방법)할당량을 늘리려면 적합한 바인딩 요소에서 MaxReceivedMessageSize 속성을 사용하십시오 (0) | 2009.12.01 |