跨线程调用控件之MethodInvoker

这是一部分重要的代码,用VS2005通过。

使用到两个控件,一个按钮button1,一个标签label1。

 


         private void button1_Click(object sender, EventArgs e)  

        {

            Thread thread=new Thread(new ThreadStart(myname));

            thread.IsBackground=true;

            thread.Start();

             // 启动一个线程。

        }

        private void myname()

        {

           MethodInvoker mi = new MethodInvoker(hello);

            //创建一个委托,hello是该委托所托管的代码,必须是声明为void的。

           Invoke(mi);//同步执行委托。               

            //BeginInvoke(mi);异步执行委托。

        }

        private void hello()

        {

            label1.Text = "我是跨线程的!";

        }


  那里不正确,一定要指出,我可不想误导人,也不想被自己误导。

PS:写完后我发现http://tb.blog.csdn.net/TrackBack.aspx?PostId=715064早就有解释,比我的还详细,领教了。

故补充以下代码:

        private Thread myThread;
        private void Form1_Load(object sender, EventArgs e)
        {
            myThread = new Thread(new ThreadStart(RunsOnWorkerThread));
            myThread.Start();
        }
        private void RunsOnWorkerThread()
        {
            //DoSomethingSlow();
            string pList = "myThread线程调用UI控件";
            label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);
        }
        //直接用System.EventHandler,没有必要自定义委托
        private void UpdateUI(object o, System.EventArgs e)
        {
           //UI线程设置label1属性
            label1.Text = o.ToString() + "成功!";
   
    }

posted @ 2008-07-10 15:24  C# Coder  阅读(6545)  评论(4编辑  收藏  举报