什么是AsyncCallback?

AsyncCallback有什么用,我们为什么要用它?

async方法完成处理时,会自动调用AsyncCallback方法,其中可以执行后处理语句。 使用这种技术,不需要轮询或等待async线程完成。

以下是有关Async Callback用法的更多解释:

callback模型:callback模型要求我们指定一个callback方法,并在callback方法中包含我们需要的任何状态来完成调用。 callback模型可以在下面的例子中看到:

 static byte[] buffer = new byte[100]; static void TestCallbackAPM() { string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb"); FileStream strm = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous); // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(CompleteRead), strm); } 

在这个模型中,我们创build一个新的AsyncCallback委托,指定一个方法在操作完成时调用(在另一个线程上)。 另外,我们正在指定一些我们可能需要的对象作为调用状态。 对于这个例子,我们正在发送stream对象,因为我们需要调用EndRead并closuresstream。

我们在调用结束时创build的方法看起来像这样:

 static void CompleteRead(IAsyncResult result) { Console.WriteLine("Read Completed"); FileStream strm = (FileStream) result.AsyncState; // Finished, so we can call EndRead and it will return without blocking int numBytes = strm.EndRead(result); // Don't forget to close the stream strm.Close(); Console.WriteLine("Read {0} Bytes", numBytes); Console.WriteLine(BitConverter.ToString(buffer)); } 

其他技术是等待完成轮询

等待完成模型等待完成模型允许您启动asynchronous调用并执行其他工作。 一旦其他工作完成,您可以尝试结束该调用,并将阻塞,直到asynchronous调用完成。

 // Make the asynchronous call strm.Read(buffer, 0, buffer.Length); IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Do some work here while you wait // Calling EndRead will block until the Async work is complete int numBytes = strm.EndRead(result); 

或者你可以使用等待手柄。

 result.AsyncWaitHandle.WaitOne(); 

轮询模型轮询方法类似,只是代码将轮询IAsyncResult以查看是否已完成。

 // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Poll testing to see if complete while (!result.IsCompleted) { // Do more work here if the call isn't complete Thread.Sleep(100); } 

想想这样。 你有一些你想要并行执行的操作。 你可以通过使用asynchronous执行的线程来启用它。 这是一个失火和遗忘的机制。

但是有些情况下需要一个机制,在这个机制中你可以开始并忘记,但是当操作完成时需要通知。 为此,您可以使用asynchronouscallback。

该操作是asynchronous的,但在操作完成时回拨。 这样做的好处是,你不必等待操作,直到完成。 您可以自由执行其他操作,因此您的线程不会被阻止。

一个例子就是大文件的后台传输。 在转移过程中,您并不想阻止用户执行其他操作。 一旦传输完成,进程将callback一个asynchronous方法,在那里你可能会popup一个消息框,说“传输完成”

AsyncCallbacks用于指定在asynchronous操作完成时调用的函数。 例如,如果您正在执行IO操作,则可以在stream上调用BeginRead并传入AsyncCAllback委托。 读取操作完成后,该函数将被调用。

有关更多信息,请参阅

  • 基于事件的asynchronous模式概述
  • 使用AsyncCallback委托来结束asynchronous操作