>  기사  >  백엔드 개발  >  UI의 다중 스레드 비동기 업데이트를 구현하기 위한 C#의 Winform 샘플 코드에 대한 자세한 소개

UI의 다중 스레드 비동기 업데이트를 구현하기 위한 C#의 Winform 샘플 코드에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-21 11:18:421858검색

이 글에서는 주로 C#에서 Winform의 멀티 스레드 비동기 업데이트 UI(진행 및 상태 정보)를 소개합니다. 편집자는 꽤 좋다고 생각하므로 지금 공유하고 참고용으로 제공하겠습니다. 에디터를 따라가서 살펴보자.

소개

많은 양의 데이터 읽기 및 쓰기 작업이 필요한 Winform 프로그램을 개발할 때 일정량의 작업이 필요한 경우가 종종 있다. 그러나 이 기간 동안에는 인터페이스 UI를 업데이트할 수 없으므로 사용자의 눈에는 인터페이스가 애니메이션이 정지된 상태로 나타나 사용자 경험이 좋지 않게 됩니다. 따라서 대용량 데이터를 처리하는 애플리케이션에서는 이러한 상황을 처리하기 위해 멀티스레딩을 사용해야 합니다. C#에서는 멀티스레딩을 사용하는 것이 매우 편리합니다. System.Threading.Thread 인스턴스의 Start 메서드만 사용하면 되지만 멀티스레딩 간의 상호 작용을 구현하는 방법은 그리 간단하지 않습니다. 이 문서에서는 하위 스레드를 사용하여 데이터를 처리하고 기본 스레드의 UI 상태를 실시간으로 업데이트하는 방법을 구현합니다. 비동기 스레드 업데이트 UI의 데모 프로그램을 구현하기 위해 단계별로 시작하겠습니다.

애플리케이션 배경

일정량의 데이터를 텍스트 파일에 쓰고, 데이터 쓰기의 실시간 진행 상황을 메인 인터페이스에 반영해야 합니다. 요구사항: 작성된 데이터를 클래스로 캡슐화해야 합니다.

구현 과정

1. 먼저 winform 프로젝트를 생성하고 메인 폼에 버튼, 진행률 표시줄, 라벨을 드래그합니다. 아래 그림과 같습니다.

2. 데이터 처리를 위한 클래스(WriteDate)를 작성합니다. 소스코드는 다음과 같습니다.

 public class DataWrite
 {
  public delegate void UpdateUI(int step);//声明一个更新主线程的委托
  public UpdateUI UpdateUIDelegate;

  public delegate void AccomplishTask();//声明一个在完成任务时通知主线程的委托
  public AccomplishTask TaskCallBack;
  
  public void Write(object lineCount)
  {
   StreamWriter writeIO = new StreamWriter("text.txt", false, Encoding.GetEncoding("gb2312"));
   string head = "编号,省,市";
   writeIO.Write(head);
   for (int i = 0; i < (int)lineCount; i++)
   {
    writeIO.WriteLine(i.ToString() + ",湖南,衡阳");
    //写入一条数据,调用更新主线程ui状态的委托
    UpdateUIDelegate(1);
   }
   //任务完成时通知主线程作出相应的处理
   TaskCallBack();
   writeIO.Close();
  }
 }

3. 메인 인터페이스의 코드는 다음과 같습니다.

먼저 생성되지 않은 컨트롤의 스레드 업데이트 제어를 구현하기 위해 대리자를 설정해야 합니다.

delegate void AsynUpdateUI(int step);

그런 다음 여러 스레드를 작성하여 데이터 쓰기 방법과 콜백 함수를 시작합니다.

  private void btnWrite_Click(object sender, EventArgs e)
  {
   int taskCount = 10000; //任务量为10000
   this.pgbWrite.Maximum = taskCount;
   this.pgbWrite.Value = 0;

   DataWrite dataWrite = new DataWrite();//实例化一个写入数据的类
   dataWrite.UpdateUIDelegate += UpdataUIStatus;//绑定更新任务状态的委托
   dataWrite.TaskCallBack += Accomplish;//绑定完成任务要调用的委托

   Thread thread = new Thread(new ParameterizedThreadStart(dataWrite.Write));
   thread.IsBackground = true;
   thread.Start(taskCount);
  }

  //更新UI
  private void UpdataUIStatus(int step)
  {
   if (InvokeRequired)
   {
    this.Invoke(new AsynUpdateUI(delegate(int s)
    {
     this.pgbWrite.Value += s;
     this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
    }), step);
   }
   else
   {
    this.pgbWrite.Value += step;
    this.lblWriteStatus.Text = this.pgbWrite.Value.ToString() + "/" + this.pgbWrite.Maximum.ToString();
   }
  }

  //完成任务时需要调用
  private void Accomplish()
  {
   //还可以进行其他的一些完任务完成之后的逻辑处理
   MessageBox.Show("任务完成");
  }

효과는 다음과 같습니다.

요약

많습니다 비동기 업데이트 UI 방식을 구현하는 방법이 있지만 이 방식이 더 유연하고 실시간으로 작업 상태를 파악하여 그에 따라 처리할 수 있다고 생각합니다. 이 모드는 여러 스레드를 사용하여 동시에 다른 데이터를 다른 파일에 쓰는 데에도 적합합니다.

위 내용은 UI의 다중 스레드 비동기 업데이트를 구현하기 위한 C#의 Winform 샘플 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.