举例说明Control.Invoke, Control.BeginInvoke, DelegateBeginInvoke
2011-11-05 22:20
489 查看
Control.Invoke, Control.BeginInvoke, DelegateBeginInvoke是很常用的调用委托方法。
它们各有区别,以下代码通过举例说明这三者之间的不同点:
它们各有区别,以下代码通过举例说明这三者之间的不同点:
#region 公用方法 //定义委托 private delegate string InvokeDelegate(string str1,string str2); //处理函数 private string InvokeMethod(string str1, string str2) { DateTime d1 = DateTime.Now; //停顿5秒 while (1 == 1) { if (DateTime.Now.Subtract(d1).TotalSeconds >= 5) { break; } } //返回值 return "OK"; } //异步委托,执行完处理函数后,回调处理结果 private void CallBackHandler(IAsyncResult iar) { if (iar.IsCompleted) { AsyncResult ar = iar as AsyncResult; string sResult = ((InvokeDelegate)ar.AsyncDelegate).EndInvoke(iar); MessageBox.Show(sResult); } } #endregion //1.控件的Invoke,在UI线程上执行。 private void btnCtrlInvoke_Click(object sender, EventArgs e) { this.Invoke(new InvokeDelegate(InvokeMethod),"",""); //需等待Invoke执行完处理函数后,才执行下一句 MessageBox.Show("Finished"); } //2.控件的BeginInvoke,在UI线程上异步执行 private void btnCtrlBeginInvoke_Click(object sender, EventArgs e) { this.BeginInvoke (new InvokeDelegate(InvokeMethod),"",""); //不需等待执行完处理函数,即执行下一句。但因为是在UI线程,所以涉及到UI操作的,都需等UI空闲后,才可刷新UI MessageBox.Show("Finished"); } //3.委托式的BeginInvoke,使用另一线程执行。 private void btnDelegateBeginInvoke_Click(object sender, EventArgs e) { InvokeDelegate xDelegate = new InvokeDelegate(this.InvokeMethod); AsyncCallback xCallBack=new AsyncCallback(CallBackHandler ); xDelegate.BeginInvoke("", "", xCallBack, ""); //不需等待执行完处理函数,即执行下一句。因为是使用另一线程,这时UI不会假死。处理函数完成后,使用回调xCallBack来反馈结果到UI。 MessageBox.Show("Finished"); }
相关文章推荐
- Control.BeginInvoke vs. delegate.BeginInvoke(1)
- Control.BeginInvoke vs. delegate.BeginInvoke(2)转
- delegate 和 control 的BeginInvoke方法的差异
- Control.BeginInvoke vs. delegate.BeginInvoke(3)转
- Control中的beginInvoke于Delegate中的beginInove一起使用
- Control.BeginInvoke 和 Delegate.BeginInvoke 备忘
- Thread.Start和Delegate.BeginInvoke 以及Control.BeginInvoke
- C#Delegate.Invoke、Delegate.BeginInvoke And Control.Invoke、Control.BeginInvoke
- WinForm 之Control.Invoke 和Control.BeginInvoke 方法的使用 Control 不能在创建它的 Thread 之外被调用。但可以通过 invoke 来保证 C
- (转载)委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke
- 异常在该控件上执行的操作正从错误的线程调用。使用 Control.Invoke 或 Control.BeginInvoke 封送到正确的线程才能执行此操作。
- Delegate.BeginInvoke例子
- WinForm二三事(三)Control.Invoke&Control.BeginInvoke
- delegate BeginInvoke& EndInvoke
- delegate 中的BeginInvoke和EndInvoke方法
- Winform中的Control.Invoke&Control.BeginInvoke
- C# delegate方法invoke和beginInvoke的区别
- 委托的Invoke 和 BeginInvoke 与Control的Invoke和BeginInvoke
- 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死
- C#-Control.Invoke与Control.BeginInvoke