Нить уступает перед асинхронным ожиданием - PullRequest
0 голосов
/ 24 октября 2018

До введения async-await программирования на C # как можно было поместить сетевой запрос в другой поток и возвращать время выполнения обратно в ЦП до тех пор, пока не будет получен ответ, чтобы этот поток не тратил время ЦП?

Потому что, когда процессор выделяет время этому потоку, а поток бездействует в ожидании ответа, это будет пустой тратой времени процессора, верно?

1 Ответ

0 голосов
/ 24 октября 2018

Однако несколькими способами Модель асинхронного программирования (APM) была предложена для этого типа Асинхронность

Асинхронная операция, которая используетшаблон проектирования IAsyncResult реализован в виде двух методов с именами BeginOperationName и EndOperationName, которые начинают и заканчивают асинхронную операцию OperationName соответственно.Например, класс FileStream предоставляет методы BeginRead и EndRead для асинхронного чтения байтов из файла.Эти методы реализуют асинхронную версию метода Read.

Чтобы ответить на ваш вопрос

Поскольку, когда ЦП выделяет время этому потоку, а поток бездействует в ожидании ответа,это было бы пустой тратой процессорного времени, верно?

Никакая блокировка потока и ожидание обратного вызова порта завершения не приводит к потере циклов ЦП, однако опрос по потоку будет.

Существует много способов, как это работает, однако пример использования можно увидеть здесь

Пример использования

private static void TestWrite()
{ 
   // Must specify FileOptions.Asynchronous otherwise the BeginXxx/EndXxx methods are
   // handled synchronously.
   FileStream fs = new FileStream(Program.FilePath, FileMode.OpenOrCreate,
      FileAccess.Write, FileShare.None, 8, FileOptions.Asynchronous);

   string content = "A quick brown fox jumps over the lazy dog";
   byte[] data = Encoding.Unicode.GetBytes(content);

   // Begins to write content to the file stream.
   Console.WriteLine("Begin to write");
   fs.BeginWrite(data, 0, data.Length, Program.OnWriteCompleted, fs);
   Console.WriteLine("Write queued");
}

private static void OnWriteCompleted(IAsyncResult asyncResult)
{ 
   // End the async operation.
   FileStream fs = (FileStream)asyncResult.AsyncState;
   fs.EndWrite(asyncResult);

   // Close the file stream.
   fs.Close();
   Console.WriteLine("Write completed");

   // Test async read bytes from the file stream.
   Program.TestRead();
}
...