dhl:C#异步方法调用(使用委托,在委托上调用BeginInvoke方法)
C#提供了异步方法调用的功能,先创建一个委托,该委托的签名要与需要异步执行的方法定义相匹配。还是以代码来说明:
通过委托实现异步调用的步骤:
1.定义委托。
2.将要进行异步调用的方法“实例化”到定义的委托。
3.在委托上调用BeginInvoke方法。其中,BeginInvoke的参数由三个部分构成。第一部分:所定义的委托的函数签名。
第二部分:希望调用的回调函数的委托。第三部分:自定义委托的实例(该实例将会在回调函数中的IAsyncResult的AsyncRState属性中重构出我们在步骤2中定义的委托实例,并借助这个实例来调用EndInvoke方法。)
4.如果我们希望在当前线程来处理异步调用的结果,则可以使用BeginInvoke方法返回一个IAsyncResult实例(例如ar)
并在当前线程等待。如果我们希望在异步线程中通过回调函数来处理结果,则我们需要在3中传递一个回调委托,并在该处理中调用EndInvoke方法。
log4net.ILog log = log4net.LogManager.GetLogger("AsyncMethod");
delegate void GetStr(string str); //委托
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button_Delegate_Click(object sender, EventArgs e)
{
log.Info("start Click!");
DateTime dt1 = DateTime.Now;
Response.Write("方法开始:" + DateTime.Now.ToString());
//同步(C#同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果)
GetStr MyDelegation = new GetStr(GetDelegation);//注册委托方法为GetInvoke
MyDelegation("用了委托的方法");//同步
Response.Write("<br />委托结束时间:" + (DateTime.Now.Subtract(dt1).TotalMilliseconds / 1000).ToString());
//异步(C#异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作)
GetStr b = new GetStr(GetInvoke);//注册委托方法为GetInvoke
b.BeginInvoke("BeginInvoke", null, null); //利用委托的异步方法。
Response.Write("方法结束:" + DateTime.Now.ToString());
}
/// <summary>
/// 委托的方法1
/// </summary>
/// <param name="str"></param>
private void GetInvoke(string str)
{
log.Info("Invoke异步调用成功!");
//由于是新起的线程,只能做这样的事情。
}
/// <summary>
/// 委托的方法2
/// </summary>
/// <param name="str"></param>
private void GetDelegation(string str)
{
this.Label3.Text = str + "现在时间:" + DateTime.Now.ToString();
Thread.Sleep(3000);
this.Label4.Text = str + "结束时间:" + DateTime.Now.ToString();
}
delegate void GetStr(string str); //委托
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button_Delegate_Click(object sender, EventArgs e)
{
log.Info("start Click!");
DateTime dt1 = DateTime.Now;
Response.Write("方法开始:" + DateTime.Now.ToString());
//同步(C#同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果)
GetStr MyDelegation = new GetStr(GetDelegation);//注册委托方法为GetInvoke
MyDelegation("用了委托的方法");//同步
Response.Write("<br />委托结束时间:" + (DateTime.Now.Subtract(dt1).TotalMilliseconds / 1000).ToString());
//异步(C#异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作)
GetStr b = new GetStr(GetInvoke);//注册委托方法为GetInvoke
b.BeginInvoke("BeginInvoke", null, null); //利用委托的异步方法。
Response.Write("方法结束:" + DateTime.Now.ToString());
}
/// <summary>
/// 委托的方法1
/// </summary>
/// <param name="str"></param>
private void GetInvoke(string str)
{
log.Info("Invoke异步调用成功!");
//由于是新起的线程,只能做这样的事情。
}
/// <summary>
/// 委托的方法2
/// </summary>
/// <param name="str"></param>
private void GetDelegation(string str)
{
this.Label3.Text = str + "现在时间:" + DateTime.Now.ToString();
Thread.Sleep(3000);
this.Label4.Text = str + "结束时间:" + DateTime.Now.ToString();
}