Что такое 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. Функция будет вызвана после завершения операции чтения.

Для получения дополнительной информации см.:

Другие вопросы по тегам