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

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

 2010-09-30 22:44:22 来源:WEB开发网   
核心提示: 这个方法的功能跟上面的操作是一样的,只不过不需要设置CheckForIllegalCrossThreadCalls属性,C#多线程编程(4):多线程与UI操作(4),而且还不会抛出异常,当然除了上面的方法之外,所以这里的例子代码注释比较简单,读者可以看周公以前的示例,还可以使用Backgroun

这个方法的功能跟上面的操作是一样的,只不过不需要设置CheckForIllegalCrossThreadCalls属性,而且还不会抛出异常,当然除了上面的方法之外,还可以使用BackgroundWorker类来完成同样的功能。

BackgroundWorker类操作界面

因为使用BackgroundWorker类操作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);
                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;
                }
        }
}

上一页  1 2 3 4 5  下一页

Tags:线程 编程 线程

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