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

BeginInvoke正在启动异步操作EndInvoke正在等待该函数的结束并返回结果。 这是在C#中执行线程的另一种方式,很棒的function是begininvoke从线程池获取线程,这对于Thread类是不正确的,另一个是你可以以更简单的方式传递参数并获得结果到线程函数。 这是一个例子http://ondotnet.com/pub/a/dotnet/2003/02/24/asyncdelegates.html

我不知道如何解释得很好,但这篇文章应该有所帮助:
在MSDN上使用代理进行异步编程

摘抄:
………….如果调用BeginInvoke方法,公共语言运行库(CLR)将请求排队并立即返回给调用者。 目标方法在线程池的线程上异步调用。 提交请求的原始线程可以自由地继续与目标方法并行执行。 如果在对BeginInvoke方法的调用中指定了回调方法,则在目标方法结束时调用回调方法。 在回调方法中, EndInvoke方法获取返回值以及任何输入/输出或仅输出参数。 如果在调用BeginInvoke时没有指定回调方法,则可以从调用BeginInvoke的线程调用EndInvoke …..

1)我们使用“EndInvoke()”来表示BeginInvoke()的结束“异步操作”吗?
不,您使用它来获取返回值或…见上文

2)这对配对的实际用途是什么?
因此,您可以在同步方法等上进行异步调用

3)我可以得到一些简单而好的例子来更恰当地理解它吗?
我很确定谷歌可以做得比我好:P

我使用Begin Invoke / End Invoke构造来运行Window的服务。

例如:

  public ServiceName() { //constructor code goes here } protected override void OnStart(string[] args) { ExecuteDelegate ed = new ExecuteDelegate(Execute); AsyncCallback ac = new AsyncCallback(EndExecution); IAsyncResult ar = ed.BeginInvoke(ac, ed); Log.WriteEntry("Service has started."); } protected void EndExecution(IAsyncResult ar) { ExecuteDelegate ed = (ExecuteDelegate)ar.AsyncState; ed.EndInvoke(ar); Stop(); Log.WriteEntry("Service has stopped."); } protected void Execute() { //Code goes here ... } protected override void OnStop() { Log.WriteEntry("Service has stopped."); } 

本质上:调用BeginInvoke以开始在新线程中执行方法。 当线程结束时,线程连接时调用的方法应该调用EndInvoke。