什么是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操作
- 为什么我的variables在函数内部修改后没有改变? – asynchronous代码引用
- 如何在不等待的情况下安全地调用C#中的asynchronous方法
- 如何使用ASP.NET Web API使用非线程安全的asynchronous/等待API和模式?
- 在ASP.Net MVC中禁用会话状态每个请求
- TaskCompletionSource:何时使用SetResult()与TrySetResult()等
- 从asynchronousJavaScript方法返回值?
- 如何在Python中每60秒asynchronous执行一次函数?
- asynchronous/等待适合IO和CPU绑定的方法吗?
- 如何限制并发asynchronousI / O操作的数量?