내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 백그라운드 작업자 사용 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

Windows Phone BackgroundWorker 클래스를 사용하면 백그라운드 스레드에서 시간이 많이 걸리는 작업을 쉽게 실행할 수 있습니다. BackgroundWorker 클래스를 통해 작업의 상태를 확인하고 작업을 취소할 수 있습니다.

BackgroundWorker 클래스를 사용하는 경우 Windows Phone 사용자 인터페이스에서 작업 진행률, 완료 및 취소를 나타낼 수 있습니다. 예를 들어, 백그라운드 작업이 완료되었거나 취소되었는지 확인하고 사용자에게 메시지를 표시할 수 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

BackgroundWorker 클래스를 사용하려면

  1. 클래스 수준에서 BackgroundWorker 클래스의 인스턴스를 만듭니다.

    BackgroundWorker bw = new BackgroundWorker();
    
  2. 백그라운드 작업에서 취소를 허용하고 진행률을 보고하게 할지 여부를 지정합니다.

    bw.WorkerSupportsCancellation = true;
    bw.WorkerReportsProgress = true;
    
  3. 백그라운드 작업자의 DoWork 이벤트에 대한 이벤트 처리기를 만듭니다.

    DoWork 이벤트 처리기는 백그라운드 스레드에서 시간이 많이 걸리는 작업을 실행하는 곳입니다. 백그라운드 작업에 전달된 모든 값이 이벤트 처리기에 전달되는 DoWorkEventArgs 개체의 Argument 속성에서 전달됩니다.

    호출 프로세스에 진행률을 보고하려면 ReportProgress 메서드를 호출하고 0에서 100까지의 완료율을 전달합니다. ReportProgress 메서드를 호출하면 ProgressChanged 이벤트가 발생합니다. 이 이벤트는 별도로 처리합니다.

    참고참고:

    백그라운드 작업자의 WorkerReportsProgress 속성이 true로 설정되어 있지 않은 경우 ReportProgress 메서드를 호출하면 예외가 발생합니다.

    백그라운드 작업을 취소하는 요청이 대기 중인지 확인하려면 BackgroundWorker 개체의 CancellationPending 속성을 검사합니다. 이 속성이 true이면 CancelAsync 메서드가 호출된 것입니다. BackgroundWorker 개체의 Cancel 속성을 true로 설정하고 작업을 중지합니다.

    데이터를 호출 프로세스에 전달하려면 이벤트 처리기에 전달되는 DoWorkEventArgs 개체의 Result 속성을 설정합니다. 이 값은 RunWorkerCompleted 이벤트가 작업이 끝날 때 발생하면 읽을 수 있습니다.

    
    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));
            }
        }
    }
    
    
    
  4. 백그라운드 작업자의 ProgressChanged 이벤트에 대한 이벤트 처리기를 만듭니다.

    ProgressChanged 이벤트 처리기에서 사용자 인터페이스 업데이트 등의 진행률을 나타내는 코드를 추가합니다.

    작업의 완료율을 확인하려면 이벤트 처리기에 전달된 ProgressChangedEventArgs 개체의 ProgressPercentage 속성을 검사합니다.

    
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        this.tbProgress.Text = (e.ProgressPercentage.ToString() + "%");
    }
    
    
    
  5. RunWorkerCompleted 이벤트에 대한 이벤트 처리기를 만듭니다.

    RunWorkerCompleted 이벤트는 백그라운드 작업자가 완료되면 발생합니다. 백그라운드 작업이 성공적으로 완료되었는지, 취소되었는지, 오류가 발생했는지에 따라 사용자 인터페이스를 적절하게 업데이트합니다.

    오류가 발생했는지 확인하려면 이벤트 처리기에 전달된 RunWorkerCompletedEventArgs 개체의 Error 속성을 검사합니다. 오류가 발생했으면 이 속성에 예외 정보가 포함됩니다.

    백그라운드 작업에서 취소를 허용하는 경우 작업이 취소되었는지 확인하려면 이벤트 처리기에 전달된 RunWorkerCompletedEventArgs 개체의 Cancelled 속성을 검사합니다. 이 속성이 true이면 CancelAsync 메서드가 호출된 것입니다.

    
    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!";
        }
    }
    
    
    
  6. 이벤트 처리기를 BackgroundWorker 인스턴스의 이벤트에 추가합니다.

    다음 예제에서는 이벤트 처리기를 DoWork, ProgressChangedRunWorkerCompleted 이벤트에 추가하는 방법을 보여 줍니다.

    bw.DoWork += 
        new DoWorkEventHandler(bw_DoWork);
    bw.ProgressChanged += 
        new ProgressChangedEventHandler(bw_ProgressChanged);
    bw.RunWorkerCompleted += 
        new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
    
  7. RunWorkerAsync 메서드를 호출하여 백그라운드 작업의 실행을 시작합니다.

    
    private void buttonStart_Click(object sender, RoutedEventArgs e)
    {
        if (bw.IsBusy != true)
        {
            bw.RunWorkerAsync();
        }
    }
    
    
    
  8. CancelAsync 메서드를 호출하여 백그라운드 작업을 취소합니다.

    
    private void buttonCancel_Click(object sender, RoutedEventArgs e)
    {
        if (bw.WorkerSupportsCancellation == true)
        {
            bw.CancelAsync();
        }
    }
    
    
    

다음 예제에서는 BackgroundWorker 클래스를 사용하는 방법을 보여 줍니다. 이 예제에서 백그라운드 작업은 Sleep 메서드를 실행하고 사용자 인터페이스에 진행률을 보고합니다. 백그라운드 작업자는 취소를 허용하도록 구성됩니다.


using Microsoft.Phone.Controls;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace SL_BackgroundWorker_CS
{
    public partial class Page : PhoneApplicationPage
    {
        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() + "%");
        }
    }
}



<phone:PhoneApplicationPage x:Class="SL_BackgroundWorker_CS.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
    shell:SystemTray.IsVisible="True">
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <StackPanel>
            <StackPanel Orientation="Horizontal" 
                        HorizontalAlignment="Left" VerticalAlignment="Top" 
                        Margin="10" >
                <Button x:Name="buttonStart" Content="Start" Click="buttonStart_Click"
                        Width="200" />
                <Button x:Name="buttonCancel" Content="Cancel" Click="buttonCancel_Click"
                        Width="200" />
            </StackPanel>
            <StackPanel Margin="10,50,0,0" Orientation="Horizontal">
                <TextBlock Text="Progress: " />
                <TextBlock x:Name="tbProgress" />
            </StackPanel>
        </StackPanel>
    </Grid>
</phone:PhoneApplicationPage>


표시:
© 2014 Microsoft