В чем разница между асинхронным программированием и многопоточностью?
Я думал, что это в основном одно и то же - написание программ, которые разделяют задачи между процессорами (на машинах с 2+ процессорами). Тогда я читаюhttps://msdn.microsoft.com/en-us/library/hh191443.aspx, который говорит
Асинхронные методы предназначены для неблокирующих операций. Выражение await в асинхронном методе не блокирует текущий поток во время выполнения ожидаемой задачи. Вместо этого выражение регистрирует остальную часть метода как продолжение и возвращает управление вызывающей стороне асинхронного метода.
Ключевые слова async и await не приводят к созданию дополнительных потоков. Асинхронные методы не требуют многопоточности, потому что асинхронный метод не выполняется в своем собственном потоке. Метод выполняется в текущем контексте синхронизации и использует время в потоке, только когда метод активен. Вы можете использовать Task.Run для перемещения работы, связанной с ЦП, в фоновый поток, но фоновый поток не помогает с процессом, который просто ожидает результатов, которые станут доступны.
и мне интересно, может ли кто-нибудь перевести это на английский для меня. Кажется, что проводится различие между асинхронностью (это слово?) И многопоточностью, и подразумевается, что у вас может быть программа, которая имеет асинхронные задачи, но не поддерживает многопоточность.
Теперь я понимаю идею асинхронных задач, таких как пример на pg. 467 Джона СкитаC # In Depth, третье издание
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
никогда не используются в теле вышеуказанной функции.)