zoukankan      html  css  js  c++  java
  • [转]多线程更新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;

      }

      }

      }

      }

  • 相关阅读:
    Python中的类(上)
    Django REST Framework API Guide 07
    Django REST Framework API Guide 06
    Django REST Framework API Guide 05
    Django REST Framework API Guide 04
    Django REST Framework API Guide 03
    Django REST Framework API Guide 02
    Django REST Framework API Guide 01
    Django 详解 信号Signal
    Django 详解 中间件Middleware
  • 原文地址:https://www.cnblogs.com/freeliver54/p/1861743.html
Copyright © 2011-2022 走看看