惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
MongoDB | Blog
MongoDB | Blog
L
LangChain Blog
WordPress大学
WordPress大学
小众软件
小众软件
IT之家
IT之家
腾讯CDC
月光博客
月光博客
量子位
Blog — PlanetScale
Blog — PlanetScale
P
Proofpoint News Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 子游

Flash / Flex Tutorial – How to Create a crossdomain.xml file javascript 跨越解决方案 Google OAuth 简单入门与使用 Complete Date Object Reference 速强软件 什么是邮件营销 server variables Oracle 笔记 日期处理 如何配置IIS7的Custom Handlers? 分布式系统设计实践 什么是在线互动营销 导入CSV文件进入系统 - 子游 - 博客园 开发自定义控件 ------------Textbox 控件(1) 如何用asp.net做一个图片handler javascript 的 Encode,Javascript,escape,encodeURI,encodeURIComponent,UTF-8 www.sugaroa.com超酷的新一代协同办公自动化系统 超酷的新一代协同办公自动化系统 什么是Rss feed 正确检查上传文件类型或者get mine type from file Sql server 国际化的支持,查询乱码
多线程更新Processbar
子游 · 2010-01-28 · via 博客园 - 子游

                    多线程更新processbar或输出后台更新前端控件

   背景

    在用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;
            }
        }
    }
}