c#如何在线程中通过传递消息更新界面

2008-05-11 09:19
如何在线程中通过传递消息更新界面
2007-10-08 16:45:30
新建win应用程序项目:testthread,把Form1.cs改名mainForm.cs,同时修改类名和main里的类名。
2、 在项目中添加一个类:SubThread,用来管理子线程及线程处理。代码如下:注释很清楚的
using System;
using System.Collections.Generic;
using System.Text;
namespace testthread
{
    //定义一个代理参数类,用以传递信息,可以根据自己的需要添加属性
    public class MessageEventArgs : EventArgs
    {
        public String Message; //传递辽符串信息
        public MessageEventArgs(string message)
        {
            this.Message = message;
        }
    }
    class SubThread
    {
        /*定义代理
         * 名称MessageEventHandler;
         * 参数
         *    object 是发送者
         *    MessageEventArgs 发送的信息
         * */
        public delegate void MessageEventHandler(object sender, MessageEventArgs e);
        //定义事件
        public event MessageEventHandler MessageSend;
        /*
         * 说明:定义事件处理函数,当然这里也可以不用直接在引发事件时调用this.MessageSend(sender, e);
         * 这里的参数要和事件代理的参数一样
         * */
        public void OnMessageSend(object sender, MessageEventArgs e)
        {
            if (MessageSend != null)
                this.MessageSend(sender, e);
        }
        //定义一个线程
        public System.Threading.Thread sendthread;
        /*线程处理函数
         * 说明:每毫秒向主界面发送一次信息
         * */
        public void Sendding()
        {
            try
            {
                while (true)
                {
                    System.Threading.Thread.Sleep(200);
                    this.OnMessageSend(this, new MessageEventArgs(DateTime.Now.ToString()));
                }
            }
            catch
            {
            }
        }
        //开始线程函数
        public void StartSend()
        {
            sendthread = new System.Threading.Thread(new System.Threading.ThreadStart(Sendding));
            sendthread.Start();
        }
        //结束线程函数
        public void EndSend()
        {
            sendthread.Abort();
        }
    }
}
3、   在主窗体上添加两个按钮,一个开始一个结束,再添加一个ListBox用来显示信息,看看主界面程序中是怎样调用处理的,有注释不再多说:
   using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace testthread
{
    public partial class mainForm : Form
    {
        SubThread _subthread;//定义一个线程
        /*定义一代理
         * 说明:其实例作为Invoke参数,以实现后台线程调用主线的函数
         * MessageEventArgs传递显示的信息.
         * */
        public delegate void MessageHandler(MessageEventArgs e);
        public mainForm()
        {
            InitializeComponent();
        }
        private void mainForm_Load(object sender, EventArgs e)
        {
            this._subthread = new SubThread();
            //添加后台线程的消息处理实现函数,
            this._subthread.MessageSend += new SubThread.MessageEventHandler(this._subthread_MessageSend);
        }
        public void Message(MessageEventArgs e)
        {
            listBox1.Items.Add( e.Message);
        }
        /*说明:通过代理,消息事件,实际就是实现在后台线程调用本函数,以前就说了在后台线程中不能直接把消息发送到主线程,
         * 那么就要用到Invoke,关于怎么用不再多说
         * 参数要和MessageEventArgs代理的参数一至
         * **/
        private void _subthread_MessageSend(object sender, MessageEventArgs e)
        {
            //实例化代理
            MessageHandler handler = new MessageHandler(Message);
            //调用Invoke
            this.Invoke(handler, new object[] { e });
        }
        private void button1_Click(object sender, EventArgs e)
        {
            this._subthread.StartSend();
            this.listBox1.Items.Add("开始....");
        }
        private void button2_Click(object sender, EventArgs e)
        {
            this._subthread.EndSend();
            this.listBox1.Items.Add("停止");
        }
    }
}

去当当网买书,价格更低,送货上门。

posted @ 2009-02-08 10:57  mark_xue  阅读(11532)  评论(3编辑  收藏  举报