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

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

 2010-09-30 22:44:22 来源:WEB开发网   
核心提示: 这样再执行程序就不会抛出异常了,不过使用上面的代码我们可能还有些犯嘀咕,C#多线程编程(4):多线程与UI操作(3),毕竟是不允许直接在线程中直接操作界面的,那么我们还可以用Invoke方法

这样再执行程序就不会抛出异常了。

不过使用上面的代码我们可能还有些犯嘀咕,毕竟是不允许直接在线程中直接操作界面的,那么我们还可以用Invoke方法。

Invoke方法来操作界面

下面是一个例子:

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:线程 编程 线程

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