В чем разница между асинхронным программированием и многопоточностью?

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

Ответы на вопрос(2)

Ваш ответ на вопрос