AsyncCallback有什麼用,我們爲什麼要用它?什麼是AsyncCallback?
回答
當async
方法完成處理時,自動調用AsyncCallback
方法,其中後處理語句可以執行。利用這種技術,不需要輪詢或等待線程完成。
這裏有Async
回調使用的一些更多的解釋:
回調模型:回調模式要求我們指定一個方法回調幷包括我們需要在回調方法來完成呼叫的任何狀態。回調模型可以看出,在下面的例子:
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);
}
在這個模型中,我們正在創造一個新的AsyncCallback
委託,指定一個方法調用(在另一個線程),當操作完成。另外,我們正在指定一些我們可能需要的對象作爲調用狀態。對於這個例子,我們正在發送流對象,因爲我們需要調用EndRead
並關閉流。
我們創造在通話結束時被稱爲會看起來像這樣的方法:
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));
}
其它技術等待,直至全熟和輪詢。
等待完成模型等待完成模型允許您啓動異步調用並執行其他工作。一旦其他工作完成,您可以嘗試結束該呼叫,並且它將阻止,直到異步呼叫完成。
// 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);
}
AsyncCallbacks用於指定在異步操作完成時調用的函數。例如,如果您正在執行IO操作,則可以在流上調用BeginRead並傳入AsyncCAllback委託。當讀取操作完成時,該函數將被調用。
欲瞭解更多信息,請參閱:
認爲它這樣。你有一些你想要並行執行的操作。你可以通過使用異步執行的線程來啓用它。這是一種失火和遺忘機制。
但是,有些情況下需要一種機制,您可以在該操作完成時觸發並忘記,但需要通知。爲此,您可以使用異步回調。
該操作是異步的,但在操作完成時會回撥。這樣做的好處是,您不必等待操作直到完成。您可以自由執行其他操作,因此您的線程不會被阻止。
一個這樣的例子將是一個大文件的後臺傳輸。在傳輸過程中,您並不想阻止用戶執行其他操作。一旦傳輸完成,該過程會以異步方式回覆您,您可能會彈出一個消息框,其中顯示'傳輸完成'
- 1. Android中的AsyncCallBack是什麼?
- 2. 爲什麼選擇AsyncCallback?
- 3. 我爲什麼要使用AsyncCallback?
- 4. 什麼是不同的回調vs新的AsyncCallback(回調)?
- 5. asynccallback failures
- 6. 爲什麼這個AsyncCallback測試在某些時候會失敗?
- 7. 爲什麼AsyncCallback不能更新我的GridView?
- 8. AsyncCallback未觸發
- 9. AsyncCallback優先
- 10. AsyncCallback到BackgroundWorker
- 11. gwt AsyncCallback - java
- 12. 的AsyncCallback CompletedSynchronously
- 13. AsyncCallback引發異常
- 14. AsyncCallback傳遞參數
- 15. 的ActiveX中的AsyncCallback
- 16. 從AsyncCallback更新UI
- 17. 方法進程(Exchange)和進程(Exchange,AsyncCallback)之間有什麼區別
- 18. 執行的AsyncCallback第一
- 19. Asynccallback with in for循環
- 20. HttpWebRequest AsyncCallback參數問題
- 21. AsyncCallback上的acceptcallback替換
- 22. AsyncCallback功能不起作用
- 23. GWT AsyncCallback - 內部類共享
- 24. 如何調試asynccallback方法
- 25. AsyncCallback的工作原理
- 26. AsyncCallback之後的異常
- 27. 默認的GWT中的AsyncCallback
- 28. GWT RPC ClassNotFoundException初始化AsyncCallback
- 29. 問題與AsyncCallback的GWT中
- 30. C#Socket.BeginSend AsyncCallback行爲(超時?)
`System.IO.Path.Combine`是組合路徑的更好方法。 – 2009-07-09 08:02:00
謝謝。我不知道Path.Combine。根據您的建議改變了答案。 – 2009-07-09 08:35:12