Я думал, что они в основном то же самое - написание программ, разделяющих задачи между процессорами (на машинах с 2+ процессорами). Затем я читаю https://msdn.microsoft.com/en-us/library/hh191443.aspx, в котором говорится:В чем отличие асинхронного программирования от многопоточности?
Асинхронные методы предназначены для неблокирующих операций. Ожидание выражение в методе async не блокирует текущий поток, а ожидает ожидаемая задача. Вместо этого выражение подписывает остальное метода как продолжение и возвращает управление вызывающему абоненту асинхронным методом.
Асинхронные и ожидающие ключевые слова не приводят к созданию дополнительных потоков . Асинхронные методы не требуют многопоточности, поскольку метод async не запускается в своем потоке. Метод работает в текущем контексте синхронизации и использует время в потоке только тогда, когда активен метод . Вы можете использовать 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
никогда не использовать в теле функции выше.)
Это приятное объяснение: http://blog.stephencleary.com/2013/11/there-is-no-thread.html –
Ссылка действительно хорошая, взгляните на нее. – Ian
'sender' и' e' предполагают, что это на самом деле обработчик событий - в значительной степени единственное место, где желательно «асинхронное void». Скорее всего, это называется нажатием кнопки или что-то в этом роде - результатом является то, что это действие происходит полностью асинхронно по отношению к остальной части приложения. Но все равно все в одном потоке - поток пользовательского интерфейса (с крошечной лентой времени в потоке IOCP, который отправляет обратный вызов в поток пользовательского интерфейса). – Luaan