수색…


통사론

  • bgWorker.CancellationPending //returns whether the bgWorker was cancelled during its operation

  • bgWorker.IsBusy //returns true if the bgWorker is in the middle of an operation

  • bgWorker.ReportProgress(int x) //Reports a change in progress. Raises the "ProgressChanged" event

  • bgWorker.RunWorkerAsync() //Starts the BackgroundWorker by raising the "DoWork" event

  • bgWorker.CancelAsync() //instructs the BackgroundWorker to stop after the completion of a task.

비고

UI 스레드 내에서 장시간 실행되는 작업을 수행하면 응용 프로그램이 응답하지 않아 사용자가 작업을 중지 한 것처럼 보일 수 있습니다. 이러한 작업은 백그라운드 스레드에서 실행하는 것이 좋습니다. 완료되면 UI를 업데이트 할 수 있습니다.

BackgroundWorker 작업 중에 UI를 변경하려면 일반적으로 업데이트중인 컨트롤에서 Control.Invoke 메서드를 사용하여 UI 스레드에 변경 내용을 호출해야합니다. 그렇게하지 않으면 프로그램에서 예외가 발생합니다.

BackgroundWorker는 일반적으로 Windows Forms 응용 프로그램에서만 사용됩니다. WPF 응용 프로그램에서 작업 은 작업을 백그라운드 스레드로 오프로드하는 데 사용됩니다 ( 비동기 / 대기 와 함께 사용 가능). UI 스레드에 대한 업데이트를 마샬링하는 것은 일반적으로 업데이트되는 속성이 INotifyPropertyChanged를 구현할 때 자동으로 수행되거나 UI 스레드의 Dispatcher를 사용하여 수동으로 수행됩니다.

BackgroundWorker에 이벤트 처리기 지정

BackgroundWorker의 인스턴스가 선언 된 후에는 수행하는 작업에 대한 속성 및 이벤트 처리기를 지정해야합니다.

    /* This is the backgroundworker's "DoWork" event handler. This 
       method is what will contain all the work you 
       wish to have your program perform without blocking the UI. */

    bgWorker.DoWork += bgWorker_DoWork;


    /*This is how the DoWork event method signature looks like:*/
    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Work to be done here   
        // ...
        // To get a reference to the current Backgroundworker:
        BackgroundWorker worker = sender as BackgroundWorker;
        // The reference to the BackgroundWorker is often used to report progress
        worker.ReportProgress(...);
    }

    /*This is the method that will be run once the BackgroundWorker has completed its tasks */

    bgWorker.RunWorkerCompleted += bgWorker_CompletedWork;

    /*This is how the RunWorkerCompletedEvent event method signature looks like:*/
    private void bgWorker_CompletedWork(object sender, RunWorkerCompletedEventArgs e)
    {
        // Things to be done after the backgroundworker has finished
    }

   /* When you wish to have something occur when a change in progress 
     occurs, (like the completion of a specific task) the "ProgressChanged" 
     event handler is used. Note that ProgressChanged events may be invoked
     by calls to bgWorker.ReportProgress(...) only if bgWorker.WorkerReportsProgress
     is set to true.  */

     bgWorker.ProgressChanged += bgWorker_ProgressChanged;

    /*This is how the ProgressChanged event method signature looks like:*/
    private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Things to be done when a progress change has been reported

        /* The ProgressChangedEventArgs gives access to a percentage,
         allowing for easy reporting of how far along a process is*/
        int progress = e.ProgressPercentage;
    }

BackgroundWorker에 속성 할당

이렇게하면 BackgroundWorker가 작업 사이에서 취소 될 수 있습니다.

bgWorker.WorkerSupportsCancellation = true;

이것은 작업자가 작업 완료 사이에 진행 상황을보고 할 수있게 해줍니다 ...

bgWorker.WorkerReportsProgress = true;

//this must also be used in conjunction with the ProgressChanged event

새 BackgroundWorker 인스턴스 만들기

BackgroundWorker는 UI 스레드를 차단하지 않고 일반적으로 시간이 많이 걸리는 작업을 수행하는 데 사용됩니다.

// BackgroundWorker is part of the ComponentModel namespace.
using System.ComponentModel;

namespace BGWorkerExample 
{
     public partial class ExampleForm : Form 
     {

      // the following creates an instance of the BackgroundWorker named "bgWorker"
      BackgroundWorker bgWorker = new BackgroundWorker();

      public ExampleForm() { ...

BackgroundWorker를 사용하여 작업을 완료합니다.

다음 예제는 BackgroundWorker를 사용하여 WinForms ProgressBar를 업데이트하는 방법을 보여줍니다. backgroundWorker는 UI 스레드를 차단하지 않고 진행률 막대의 값을 업데이트하므로 작업이 백그라운드에서 수행되는 동안 반응적인 UI가 표시됩니다.

namespace BgWorkerExample
{
    public partial class Form1 : Form
{

    //a new instance of a backgroundWorker is created.
    BackgroundWorker bgWorker = new BackgroundWorker();
    
    public Form1()
    {
        InitializeComponent();

        prgProgressBar.Step = 1;

        //this assigns event handlers for the backgroundWorker
        bgWorker.DoWork += bgWorker_DoWork;
        bgWorker.RunWorkerCompleted += bgWorker_WorkComplete;

        //tell the backgroundWorker to raise the "DoWork" event, thus starting it.
        //Check to make sure the background worker is not already running.
        if(!bgWorker.IsBusy)
            bgWorker.RunWorkerAsync();
        
    }

    private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        //this is the method that the backgroundworker will perform on in the background thread.
        /* One thing to note! A try catch is not necessary as any exceptions will terminate the backgroundWorker and report 
          the error to the "RunWorkerCompleted" event */
        CountToY();    
    }

    private void bgWorker_WorkComplete(object sender, RunWorkerCompletedEventArgs e)
    {
        //e.Error will contain any exceptions caught by the backgroundWorker
        if (e.Error != null)
        {
            MessageBox.Show(e.Error.Message);
        }
        else
        {
            MessageBox.Show("Task Complete!");
            prgProgressBar.Value = 0;
        }
    }

    // example method to perform a "long" running task.
    private void CountToY()
    {
        int x = 0;

        int maxProgress = 100;
        prgProgressBar.Maximum = maxProgress;
        

        while (x < maxProgress)
        {
            System.Threading.Thread.Sleep(50);
            Invoke(new Action(() => { prgProgressBar.PerformStep(); }));
            x += 1;
        }
    }


}

결과는 다음과 같습니다 ...

여기에 이미지 설명을 입력하십시오. 여기에 이미지 설명을 입력하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow