Что такое AsyncCallback?



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

485   3  

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 делегировать, указав метод для вызова (в другом потоке), когда операция завершена. Кроме того, мы указываем некоторый объект, который нам может понадобиться в качестве состояния вызова. В этом примере мы отправляем объект 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. Функция будет вызвана после завершения операции чтения.

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

Comments

    Ничего не найдено.