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

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Jina AI
Jina AI
The Cloudflare Blog
V
Visual Studio Blog
博客园_首页
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
博客园 - Franky

博客园 - 子游

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