Я думал, что это в основном одно и то же - написание программ, которые разделяют задачи между процессорами (на машинах с 2+ процессорами). Тогда я читаю это , в котором говорится:
Асинхронные методы предназначены для неблокирующих операций. Выражение await в асинхронном методе не блокирует текущий поток во время выполнения ожидаемой задачи. Вместо этого выражение регистрирует оставшуюся часть метода как продолжение и возвращает управление вызывающей стороне асинхронного метода.
Ключевые слова async и await не приводят к созданию дополнительных потоков. Асинхронные методы не требуют многопоточности, потому что асинхронный метод не выполняется в своем собственном потоке. Метод выполняется в текущем контексте синхронизации и использует время в потоке, только когда метод активен. Вы можете использовать Task.Run для перемещения работы, связанной с ЦП, в фоновый поток, но фоновый поток не помогает с процессом, который просто ждет, когда результаты станут доступны.
и мне интересно, может ли кто-нибудь перевести это на английский для меня. Кажется, что проводится различие между асинхронностью (это слово?) И многопоточностью, и подразумевается, что у вас может быть программа, которая имеет асинхронные задачи, но не поддерживает многопоточность.
Теперь я понимаю идею асинхронных задач, таких как пример на pg. 467 из C # Джона Скита в глубине, третье издание
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
В async
ключевое слово означает « Эта функция, когда она называется, не будет вызываться в контексте , в котором его завершение требуется для всего после того, как его призыв называть.»
Другими словами, писать это в середине какой-то задачи
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, поскольку не DisplayWebsiteLength()
имеет ничего общего с x
или y
, приведет DisplayWebsiteLength()
к выполнению "в фоновом режиме", как
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Очевидно, это глупый пример, но я прав или я совершенно сбит с толку или как?
(Кроме того, я не понимаю, почему sender
и e
никогда не используется в теле вышеуказанной функции.)
sender
и e
предполагают, что это на самом деле обработчик событий - практически единственное место, где async void
это желательно. Скорее всего, это вызывается нажатием кнопки или чем-то в этом роде, в результате чего это действие происходит совершенно асинхронно по отношению к остальной части приложения. Но все это все в одном потоке - потоке пользовательского интерфейса (с небольшим промежутком времени в потоке IOCP, который отправляет обратный вызов в поток пользовательского интерфейса).
DisplayWebsiteLength
кода: вы не должны использовать HttpClient
в using
утверждении. При большой нагрузке код может исчерпать количество доступных сокетов, что приводит к ошибкам SocketException. Больше информации о неправильной реализации .