您的位置:首页 > 其它

举例说明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");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: