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

推荐订阅源

T
Tenable Blog
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
H
Help Net Security
F
Fortinet All Blogs
MyScale Blog
MyScale Blog
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
博客园 - 司徒正美
量子位
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
Vercel News
Vercel News
aimingoo的专栏
aimingoo的专栏
I
InfoQ
Microsoft Security Blog
Microsoft Security Blog
Scott Helme
Scott Helme
The Last Watchdog
The Last Watchdog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
AI
AI
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
Google Online Security Blog
Google Online Security Blog
U
Unit 42
V2EX - 技术
V2EX - 技术
MongoDB | Blog
MongoDB | Blog
Schneier on Security
Schneier on Security
博客园 - Franky
H
Heimdal Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
W
WeLiveSecurity
P
Privacy & Cybersecurity Law Blog
Cloudbric
Cloudbric
B
Blog RSS Feed
N
News | PayPal Newsroom
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
I
Intezer
Hacker News - Newest:
Hacker News - Newest: "LLM"
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园_首页
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and 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;
            }
        }
    }
}