Что такое использование AsyncCallback и почему мы должны его использовать?
Что такое AsyncCallback?
Ответ 1
Когда метод async
завершает обработку, автоматически вызывается метод AsyncCallback
, где могут выполняться операторы пост-обработки. С помощью этой технологии нет необходимости опроса или ожидания завершения потока async
.
Вот еще несколько пояснений к 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);
}
Ответ 2
Подумайте об этом так. У вас есть некоторые операции, которые вы хотели бы выполнить параллельно. Вы включили бы это, используя потоки, которые выполняются асинхронно. Это механизм огня и забывания.
Но в некоторых ситуациях требуется механизм, при котором вы можете запускать и забывать, но при этом необходимо уведомление, когда операция завершается. Для этого вы будете использовать асинхронный вызов.
Операция асинхронна, но вызывает вызов при завершении операции. Преимущество этого заключается в том, что вам не нужно ждать операции до ее завершения. Вы можете выполнять другие операции и, следовательно, ваш поток не блокируется.
Примером этого может служить перенос фона большого файла. Пока выполняется передача, вы действительно не хотите блокировать пользователя от выполнения других операций. Как только передача будет завершена, процесс перезвонит вам по асинхронному методу, где вы, вероятно, можете открыть окно сообщения, в котором говорится: "Передача завершена"
Ответ 3
AsyncCallbacks используются для указания функции для вызова при завершении асинхронной операции. Например, если вы выполняли операцию ввода-вывода, вы вызывали BeginRead в потоке и передавали делегат AsyncCAllback. Функция будет вызываться, когда операция чтения будет завершена.
Для получения дополнительной информации см.