Что такое AsyncCallback?

в чем польза AsyncCallback и почему мы должны использовать его?

3 ответов


когда async метод завершения обработки,AsyncCallback автоматически вызывается метод, в котором могут выполняться операторы обработки post. С помощью этой техники нет необходимости опрашивать или ждать 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 делегировать, указав метод для вызова (в другом потоке) после завершения операции. Кроме того, мы указываем некоторый объект, который нам может понадобиться в качестве состояния вызова. В этом примере мы отправляем объект stream, потому что нам нужно будет вызвать 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));
}

другие методы подождите-пока-сделано и опрос.

Подожди-До-Сделано Модель модель wait-until-done позволяет запускать асинхронный вызов и выполнять другие работы. После завершения другой работы вы можете попытаться завершить вызов, и он будет блокироваться до завершения асинхронного вызова.

// 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);

или вы можете использовать wait рукоять.

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

дополнительная информация: