Ответ 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);
}