[转]多线程更新Processbar

本文转自: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;

  }

  }

  }

  }

 

posted on 2010-10-26 17:42  freeliver54  阅读(1380)  评论(2编辑  收藏  举报

导航