[转]多线程更新Processbar

本文介绍如何在Windows Form应用程序中使用多线程处理后台任务,并安全地更新UI元素,如进度条和标签,避免界面冻结,提供良好的用户体验。

本文转自:http://dotnet.chinaitlab.com/CSharp/801729.html

背景

  在用Windows Form编程时候,我们通常会遇到如此问题:

  1. 后台更新大量处理数据过程。

  2.需要把后台的Log输出到前端,以监控运行状态。

  3. 如果运行大量处理过程,前端会出现白屏状态,这样对用户不友好。

  针对此,我们需求创建多线程来处理后台。用多线程调用处理,按平常处理,是不能更新主线程的控件的,需要做特殊处理。

  代码程序如下:

  using System;

  using System.Collections.Generic;

  using System.ComponentModel;

  using System.Data;

  using System.Drawing;

  using System.Linq;

  using System.Text;

  using System.Windows.Forms;

  using System.Threading;

  namespace TestWinForm

  {

  public partial class Form1 : Form

  {

  delegate void SetValueCallback(int value);

  public Form1()

  {

  InitializeComponent();

  }

  private void btnRun_Click(object sender, EventArgs e)

  {

  Thread t = new Thread(new ThreadStart(Foo));

  t.Start();

  }

  private void Foo()

  {

  for (int i = 1; i <= 100; i++)

  {

  Thread.Sleep(100);

  SetProcessBarValue(i);

  SetLabelValue(i);

  }

  }

  private void SetLabelValue(int value)

  {

  // InvokeRequired required compares the thread ID of the

  // calling thread to the thread ID of the creating thread.

  // If these threads are different, it returns true.

  if (this.lblStatus.InvokeRequired)

  {

    SetValueCallback d = new SetValueCallback(SetLabelValue);

    this.Invoke(d, new object[] { value });

  }

  else

  {

    this.lblStatus.Text = value.ToString()+'%';

  }

  }

  private void SetProcessBarValue(int value)

  {

  // InvokeRequired required compares the thread ID of the

  // calling thread to the thread ID of the creating thread.

  // If these threads are different, it returns true.

  if (this.prbStatus.InvokeRequired)

  {

    SetValueCallback d = new SetValueCallback(SetProcessBarValue);

    this.Invoke(d, new object[] { value });

  }

  else

  {

    this.prbStatus.Value = value;

  }

  }

  }

  }

 

转载于:https://www.cnblogs.com/freeliver54/archive/2010/10/26/1861743.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值