C#에서 진행률 표시줄 만들기

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. Windows Forms 앱(.NET Framework)에서 진행률 표시줄 만들기
  2. C#에서 BackgroundWorker 클래스를 사용하여 진행률 표시줄 만들기
  3. C#에서 텍스트로 진행률 표시줄 만들기
C#에서 진행률 표시줄 만들기

긴 파일 작업 및 계산에는 진행률 표시가 필요하며 진행률 표시줄은 장기 실행 작업 중에 사용자에게 진행률 정보를 표시하는 가장 좋은 방법입니다. 이 자습서에서는 Visual Studio 2022를 사용하여 C#에서 세 가지 진행률 표시줄을 만드는 방법을 알려줍니다.

C#의 동적 진행률 표시줄에는 범위를 지정하는 두 가지 속성(MaximumMinimum 속성)이 있으며, 주로 복사할 파일 또는 실행할 프로세스 수와 동일합니다. 또한 프로세스가 완료되고 진행률 표시줄의 값을 증가시키기 위해 PerformStep 메서드와 함께 Step 속성이 사용됩니다.

C#의 미리 디자인된 진행률 표시줄은 가로로만 방향을 지정할 수 있습니다. 그러나 필요에 따라 사용자 지정 진행률 표시줄을 만들 수 있습니다. 진행률 표시줄의 주요 목적은 C# 애플리케이션에서 현재 수행 중인 작업의 진행률을 사용자에게 알리는 것입니다.

Windows Forms 앱(.NET Framework)에서 진행률 표시줄 만들기

진행률 표시줄은 작업 진행률을 나타내는 사용자 인터페이스 요소 역할을 합니다. C#의 진행률 표시줄은 진행률을 나타내는 두 가지 모드(미확정 및 연속)를 지원합니다.

진행률 표시줄의 불확정 모드는 시간이 얼마나 걸릴지 모르는 작업이나 작업을 수행할 때 유용합니다. C# 애플리케이션이 여전히 사용자에게 응답하는 동안 백그라운드 스레드에서 데이터를 비동기식으로 로드하여 수행됩니다(일반적으로 BackgroundWorker 클래스의 도움으로).

데이터가 로드되고 실제 진행이 시작될 때까지 설정될 때 확정되지 않은 진행률 표시줄을 표시하는 것이 일반적인 디자인 패러다임입니다. WinForms에서 진행률 표시줄을 생성할 때 진행률 표시줄의 Style 속성을 Marquee로 설정하는 것이 중요합니다.

그러나 WPM의 진행률 표시줄에는 스타일과 유사한 Isdeterminate 속성이 있으며 True 값은 Marquee와 유사하게 작동합니다.

// namespaces for C# windows application (.NET Framework)

using System;
using System.Windows.Forms;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a `progressBar1` progress bar in your C# project design
    private void progressBar1_Click(object sender, EventArgs e) {}

    // create a method that performs some calculations
    // the progress bar will synch with this method and progress accordingly
    private void Caluculate(int i) {
      // perform a task
    }

    // create a `RunOperation` button to perform calculations or take action in your C# project
    // design
    private void RunOperation_Click(object sender, EventArgs e) {
      // set the visibility of progress bar
      progressBar1.Visible = true;

      for (int j = 0; j < 10000001; j++) {
        Caluculate(j);
        if (j == 10000000) {
          MessageBox.Show("Operation Complete!");
          progressBar1.Visible = false;
        }
      }
    }
    private void Form1_Load(object sender, EventArgs e) {
      // for indeterminate progress using .NET framework
      progressBar1.Style = ProgressBarStyle.Marquee;

      progressBar1.Visible = false;
    }
  }
}

출력:

Windows Forms의 C# 진행률 표시줄 - 출력 1

진행률 표시줄은 데이터가 로드될 때 진행률을 보고할 때만 그 목적을 올바르게 수행합니다. C# 응용 프로그램에서 진행률 표시줄은 소프트웨어 설치, 긴 작업 수행 및 시작에 널리 사용되므로 사용자는 프로세스에 걸리는 시간과 남은 진행률을 정확히 알 수 있습니다.

C#에서 연속 진행률 표시줄을 만들려면 RunOperation_Click 이벤트에서 코드를 제거하고 다음 코드로 바꿉니다.

private void RunOperation_Click(object sender, EventArgs e) {
  progressBar1.Visible = true;
  progressBar1.Maximum = 10000000;
  progressBar1.Value = 1;

  for (int j = 0; j < 10000001; j++) {
    Caluculate(j);

    if (progressBar1.Value == 10000000) {
      MessageBox.Show("Operation Complete!");
      progressBar1.Visible = false;
      break;
    }

    // it will measure the progress of the task or operations and progress in regards to the
    // completion of a task It only requires if the progress bar style is not set to Marquee
    progressBar1.PerformStep();
  }
}

출력:

Windows Forms의 C# 진행률 표시줄 - 출력 2

Form1_Load 이벤트에서 progressBar1.Style = ProgressBarStyle.Marquee;를 주석 처리합니다. C# 코드의 줄과 작업 완료율 %에 따라 진행률 표시줄이 계속 나타납니다.

C#에서 BackgroundWorker 클래스를 사용하여 진행률 표시줄 만들기

C# 애플리케이션에서 진행률 표시줄을 사용하는 것이 얼마나 간단한지 명확해야 합니다. 이제 정적 값뿐만 아니라 일부 실제 작업과 동기화하여 진행률 표시줄이 앞으로 이동하는 방식을 연구할 시간입니다.

대부분의 새로운 C# 개발자가 문제에 부딪히는 곳은 동일한 스레드에서 동시에 작업을 수행하고 진행률 표시줄을 업데이트할 수 없다는 사실을 깨달을 때입니다. C# 애플리케이션의 사용자 인터페이스 스레드에서 무거운 작업을 수행하고 그에 따라 진행률 표시줄을 업데이트하려는 경우 C#의 BackgroundWorker 클래스 서비스가 필요합니다.

진행률 표시줄을 거의 쓸모 없게 만드는 BackgroundWorker 클래스의 도움 없이는 말입니다. 진행률 표시줄은 작업이 성공적으로 완료되기 전에는 진행률에 대한 업데이트를 표시하지 않으며 백그라운드 작업자가 단일 스레드에서 둘 다 동시에 업데이트해야 합니다.

작업자 스레드에서 작업을 수행한 다음 업데이트를 사용자 인터페이스 스레드로 푸시하여 진행률 표시줄을 즉시 업데이트하고 이러한 업데이트를 표시하기 위해 C#에서 작업하는 백그라운드로 진행률 표시줄을 만드는 이상적인 방법입니다.

using System;
using System.Windows;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a progress bar in your C# project's Form1.cs [Design]
    private void progressBar1_Click(object sender, EventArgs e) {}

    // a button to perform an operation synched with the `progressBar1`
    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    // Form1 load event
    private void Form1_Load(object sender, EventArgs e) {}

    // create a method that connects `BackgroundWorker` with a task
    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 100; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);
      }
    }

    // create a method that connects a task with the `progressBar1`
    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

출력:

BackgroundWorker를 사용하는 C# 진행률 표시줄 - 출력

C#에서 텍스트로 진행률 표시줄 만들기

일반적으로 구성을 더 잘 제어할 수 있는 사용자 지정 진행률 표시줄을 만들 수 있습니다. 그러나 진행률 표시줄을 만들기 위해 처음부터 C# 코드를 작성하는 것은 시간이 오래 걸리는 작업입니다. Syncfusion UI Control 또는 ShellProgressBar와 같은 NuGet 패키지를 사용하여 놀라운 디자인의 바로 사용할 수 있는 진행률 표시줄을 얻을 수 있습니다.

텍스트가 있는 진행률 표시줄을 만드는 가장 간단한 방법은 레이블을 사용하고 작업 진행에 따라 텍스트를 변경하는 것입니다. 진행 상황을 작업 진행 상황과 동기화할 수 있습니다.

using System;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    private void Form1_Load(object sender, EventArgs e) {
      // make the percentage label `backcolor` transparent
      label1.BackColor = Color.Transparent;
    }

    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 101; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);

        // to support multi-threading for label1 and label 2
        if (label1.InvokeRequired) {
          label1.Invoke(new MethodInvoker(delegate {
            // shows the progression, it is syched with the task progression
            label1.Text = "Progress: " + i + "%";
          }));
        }

        if (label2.InvokeRequired) {
          label2.Invoke(new MethodInvoker(delegate {
            if (i < 25) {
              label2.Text = "Starting the task...";
            } else if (i > 25 && i < 50) {
              label2.Text = "Half way through...";
            } else if (i > 50 && i < 99) {
              label2.Text = "The wait will be over soon...";
            } else if (i == 100) {
              label2.Text = "Task is completed successfully!";
            }
          }));
        }
      }
    }

    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      // it will update the progress bar in real time depends on the progress of a task
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

출력:

텍스트가 있는 C# 진행률 표시줄 - 출력

이 C# 코드를 실행하기 전에 C# 프로젝트의 Form1 [Design]에서 progressBar1 진행률 표시줄, 작업 실행 버튼, label1label2 레이블을 만들어야 합니다.

이 자습서에서는 다양한 유형의 진행률 표시줄을 만들고 C#의 BackgroundWorker 클래스를 사용하여 작업의 실제 진행률과 동기화하는 방법을 배웠습니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

관련 문장 - Csharp WinForms