WEB开发网
开发学院软件开发C语言 C#多线程编程(4):多线程与UI操作 阅读

C#多线程编程(4):多线程与UI操作

 2010-09-30 22:44:22 来源:WEB开发网   
核心提示: 当然,除了BackgroundWorker可以完成上面的功能之外,C#多线程编程(4):多线程与UI操作(5),利用System.Windows.Forms.Timer类也能完场上面的功能,代码如下:usingSystem;usingSystem.Collections.Generic;usin

当然,除了BackgroundWorker可以完成上面的功能之外,利用System.Windows.Forms.Timer类也能完场上面的功能,代码如下:

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

总结:本篇主要讲述了使用线程操作Windows应用程序界面的方法,这些方法在编写多线程的UI程序时可以参考。

出处http://zhoufoxcn.blog.51cto.com/792419/267495

上一页  1 2 3 4 5 

Tags:线程 编程 线程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接