class AsynchronousDemo { public delegate void DemoDelegate(); static void Main() { DemoDelegate d = PrintA; IAsyncResult AResult = d.BeginInvoke(Callback,null); d.EndInvoke(AResult); Console.ReadKey(true); } static void PrintA() { Console.WriteLine("....Method in Print A Running ...."); Thread.Sleep(4000); Console.WriteLine("....Method in Print A Completed..."); } static void Callback(IAsyncResult ar) { Console.WriteLine("I will be finished after method A completes its execution"); } }
1)我们使用“EndInvoke()”来表示BeginInvoke()的结束“异步操作”吗?
2)这对配对的实际用途是什么?
3)我可以得到一些简单而好的例子来更恰当地理解它吗?
解决方法
// pseudocode Main() { DoLaundry() GoAboutYourDay() } DoLaundry() { // boring parts here }
现在想象一下,您希望能够在洗衣服的同时度过一天.一种解决方案是让别人去做.所以你把它带到一家清洁店,告诉他们该做什么,给他们你的衣服,并告诉他们完成后给你打电话.作为回报,他们会给你一张票,这样他们可以在你想要的时候再找到你的衣服.
// pseudocode Main() { ticket = DoLaundry.BeginDoing(CallMeWhenDone) GoAboutYourDay() ticket.WaitUntilDone() } CallMeWhenDone(ticket) { cleanLaundry = DoLaundry.FinishDoing(ticket) }
这是异步操作的工作原理.
BeginInvoke你告诉程序你需要做什么(委托),什么时候完成调用(回调),以及用什么来做(状态).您将返回IAsyncResult,这是您需要将其返回以便接收结果的对象.然后,您可以执行其他操作,或使用IAsyncResult中的WaitHandle进行阻止,直到操作完成.
回调:当异步操作完成时,它将调用此方法,为您提供与以前相同的IAsyncResult.此时,您可以从中检索状态对象,或将IAsyncResult传递给EndInvoke.
EndInvoke:此函数接受IAsyncResult并查找操作的结果.如果还没有完成,它会阻塞直到它完成,这就是你通常在回调中调用它的原因.
这是一种经常在整个框架中使用的模式,而不仅仅是函数委托.数据库连接,套接字等都经常有Begin / End对.
MSDN上有关于模式的文档:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。