异步调用在,NET编程中经常出现,比较自己去写线程,用异步调用无疑提高了开发效率,而且在稳定性上也有保证,常用的异步调用步骤如下:
首先是申明代理,public delegate string TestInvoke(); //声明一个代理,符合该签名的方法必须返回一个字符串
然后写个简单的类来验证异步调用的结果
public class Test
{
public string testInvoke()
{
Console.WriteLine("异步调用开始");
return "异步调用结束";
}
public void testcallback(IAsyncResult back)
{Console.WriteLine(back.AsyncState);}
}
delegate的BeginInvoke方法用于开始异步调用,该方法有两个参数,第一个参数是该异步调用的回调方法,所谓回调方法,就是说当后台异步调用完成后,后台自动去执行的函数,上类中的testcallback方法就是个回调方法,该方法必须接受一个IAsyncResult 参数
第二个参数是个对象。这个对象将会存放在BeginInvoke返回的IASyncResult对象的AsyncState实体里面,IASyncResult可以把他当做一个通知单,该通知单的返回就表示异步调用已经开始,同时,通过查询IASyncResult里面的IsCompleted属性可以得知调用是否完成
下面实际操作一番
Test tclass=new Test();
TestInvoke _testinvoke=new TestInvoke(tclass.run);
IAsyncResult te=_testinvoke.BeginInvoke(new AsyncCallback(“这是回调“),"test");
string endreturn=_testinvoke.EndInvoke(te);
Console.WriteLine(endreturn);
然后看看屏幕打印的结果,一切就明白了
你也可以将testInvoke方法改成一个循环,再看看结果,印象会更深刻
同时,在实际使用过程中,推荐自己写类继承IAsyncResult ,这样哟功能起来会更方便
EndInvoke还可以检测到BeginInvoke在执行过程中出现的异常,所以在BeginInvoke的同时最好是把EndInvoke也用上