实现子线程上操作窗体控件

来源:互联网 发布:linux kill进程 编辑:程序博客网 时间:2024/05/06 03:08
方法一:MethodInvoker  (不接受参数)

MSDN定义表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。

MSDN备注:MethodInvoker 提供一个简单委托,该委托用于调用含 void 参数列表的方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。
        private void button1_Click(object sender, EventArgs e)        {            Thread MyThread = new Thread(new ThreadStart(ThreadFun));            MyThread.Start();        }        private void ThreadFun()        {            MethodInvoker mi = new MethodInvoker(this.InvokeFun);            this.BeginInvoke(mi);        }        private void InvokeFun()        {            textBox1.Text ="fuck!";        }

方法二:BeginInvoke (可接受参数)

MSDN定义:在创建控件的基础句柄所在线程上异步执行指定委托。

MSDN备注:可异步调用委托并且此方法立即返回。 可以从任何线程(甚至包括拥有该控件句柄的线程)调用此方法。 如果控件句柄尚不存在,则此方法沿控件的父级链搜索,直到它找到有窗口句柄的控件或窗体为止。 如果找不到合适的句柄,BeginInvoke 将引发异常。 此委托方法中的异常被视为未捕获的异常,将发送给应用程序的未捕获的异常处理程序。您可以视需要调用 EndInvoke 来检索委托的返回值,但不要求一定这样做。 EndInvoke 将一直阻止,直到可以检索返回值。

        private Thread BeginInvokeThread;        private delegate void BeginInvokeDelegate(string name);        private void StartMethod()        {            //C代码段......            string name = "cpsa3";            BeginInvokeDelegate Myname = new BeginInvokeDelegate(BeginInvokeMethod);            IAsyncResult testRecult = this.BeginInvoke(Myname, name);            //D代码段......          }        private void BeginInvokeMethod(string name)        {            //E代码段              textBox1.Text = name;        }        private void button1_Click(object sender, EventArgs e)        {            //A代码段.......            BeginInvokeThread = new Thread(new ThreadStart(StartMethod));            BeginInvokeThread.Start();            //B代码段......          }


原创粉丝点击