C#异步操作
实际上,我很难理解BeginInvoke()和EndInvoke()对.
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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |