Я подумав, що вони в основному те саме - писати програми, які розділяють завдання між процесорами (на машинах, які мають 2+ процесори). Потім я читаю це , що говорить:
Методи асинхронізації призначені для неблокуючих операцій. Вираз очікування в методі асинхронізації не блокує поточний потік під час виконання очікуваного завдання. Натомість вираз підписує решту методу у вигляді продовження і повертає керування виклику методу 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
ніколи не використовуються в тілі зазначеної вище функції.)
sender
і e
припускають, що це насправді обробник подій - майже єдине місце, де async void
бажано. Швидше за все, це викликається натисканням кнопки або чимось подібним - в результаті цього ця дія відбувається повністю асинхронно щодо решти програми. Але все це все на одній нитці - потоці інтерфейсу користувача (з невеликим проміжком часу на потоці IOCP, який розміщує зворотний виклик у потоці інтерфейсу користувача).
DisplayWebsiteLength
зразка коду: Ви не повинні використовувати HttpClient
у using
виписці - Під великим навантаженням код може вичерпати кількість наявних сокетів, що призводить до помилок SocketException. Більше інформації про неналежну інстанцію .