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