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;

      }

      }

      }

      }

  • 相关阅读:
    Higher-Order Functions and Lambdas
    dispatch_sync:As an optimization, this function invokes the block on the current thread when possible
    为什么使用dispatch_sync
    如何安全使用dispatch_sync
    dispatch_sync
    Dispatch Queues and Thread Safety
    高阶函数-参数与返回值
    In Swift, typedef is called typealias:
    偏函数应用(Partial Application)和函数柯里化(Currying)
    Centos下添加用户到用户组
  • 原文地址:https://www.cnblogs.com/freeliver54/p/1861743.html
Copyright © 2011-2022 走看看