C#编程:多线程与UI操作

    为了让程序尽快响应用户操作,在开发Windows应用程序时经常会使用到线程。对于耗时的操作如果不使用线程将会是UI界面长时间处于停滞状态,这种情况是用户非常不愿意看到的,在这种情况下我们希望使用线程来解决这个问题。

    简单贴出几种处理情况的代码,慢慢琢磨吧!

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 ThreadPoolDemo 
{ 
        public partial class ThreadForm : Form 
        { 
                //定义delegate以便Invoke时使用 
                private delegate void SetProgressBarValue(int value); 
                private BackgroundWorker worker; 
                public ThreadForm() 
                { 
                        InitializeComponent(); 
                } 
 
                private void btnThread_Click(object sender, EventArgs e) 
                { 
                        progressBar.Value = 0; 
                        //指示是否对错误线程的调用,即是否允许在创建UI的线程之外访问线程 
                        //CheckForIllegalCrossThreadCalls = false; 
                        Thread thread = new Thread(new ThreadStart(Run)); 
                        thread.Start(); 
                } 
                //使用线程来直接设置进度条 
                private void Run() 
                { 
                        while (progressBar.Value < progressBar.Maximum) 
                        { 
                                progressBar.PerformStep(); 
                        } 
                } 
 
                private void btnInvoke_Click(object sender, EventArgs e) 
                { 
                        progressBar.Value = 0; 
                        Thread thread = new Thread(new ThreadStart(RunWithInvoke)); 
                        thread.Start(); 
                } 
                //使用Invoke方法来设置进度条 
                private void RunWithInvoke() 
                { 
                        int value = progressBar.Value; 
                        while (value< progressBar.Maximum) 
                        { 
                                //如果是跨线程调用 
                                if (InvokeRequired) 
                                { 
                                        this.Invoke(new SetProgressBarValue(SetProgressValue), value++); 
                                } 
                                else 
                                { 
                                        progressBar.Value = ++value; 
                                } 
                        } 
                } 
                //跟SetProgressBarValue委托相匹配的方法 
                private void SetProgressValue(int value) 
                { 
                        progressBar.Value = value; 
                } 
 
                private void btnBackgroundWorker_Click(object sender, EventArgs e) 
                { 
                        progressBar.Value = 0; 
                        worker = new BackgroundWorker(); 
                        worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
                        //当工作进度发生变化时执行的事件处理方法 
                        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
                        //当事件处理完毕后执行的方法 
                        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
                        worker.WorkerReportsProgress = true;//支持报告进度更新 
                        worker.WorkerSupportsCancellation = false;//不支持异步取消 
                        worker.RunWorkerAsync();//启动执行 
                        btnBackgroundWorker.Enabled = false; 
                } 
                //当事件处理完毕后执行的方法 
                void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
                { 
                        btnBackgroundWorker.Enabled=true; 
                } 
                //当工作进度发生变化时执行的事件处理方法 
                void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
                { 
                        //可以在这个方法中与界面进行通讯 
                        progressBar.Value = e.ProgressPercentage; 
                } 
                //开始启动工作时执行的事件处理方法 
                void worker_DoWork(object sender, DoWorkEventArgs e) 
                { 
                        int value = progressBar.Value; 
                        while (value < progressBar.Maximum) 
                        { 
                                worker.ReportProgress(++value);//汇报进度 
                        } 
                } 
                //使用System.Windows.Forms.Timer来操作界面能 
                private void btnTimer_Click(object sender, EventArgs e) 
                { 
                        progressBar.Value = 0; 
                        //注意在.net中有多个命名空间下存在Timer类,为了便于区别,使用了带命名空间形式 
                        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); 
                        timer.Interval = 1; 
                        timer.Tick += new EventHandler(timer_Tick); 
                        timer.Enabled = true; 
                } 
                //Timer中要定期执行的方法 
                void timer_Tick(object sender, EventArgs e) 
                { 
                        int value = progressBar.Value; 
                        if (value < progressBar.Maximum) 
                        { 
                                progressBar.Value = value+100; 
                        } 
                } 
        } 
} 

转自:多线程编程(4):多线程与UI操作

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值