[ Полезный рекламный блок ]
Попробуйте свои силы в игре, где ваши навыки программирования на C# станут решающим фактором. Переходите по ссылке 🔰.
Асинхронне програмування в C# дозволяє писати код, який може виконувати тривалі завдання без блокування основного потоку. Це важливо для додатків, які мають бути чуйними й обробляти безліч одночасних користувачів.
Щоб зробити метод асинхронним у C#, ви можете використовувати ключові слова async і await. Ось приклад:
1 2 3 4 5 6 7 8 9 |
public async Task<int> CalculateAsync(int x, int y) { int result = await Task.Run(() => { // do some heavy calculation here return x + y; }); return result; } |
У цьому прикладі ключове слово async використовується для позначення методу як асинхронного. Тип повернення – Task<int>, що вказує на те, що метод поверне об’єкт Task, який зрештою видасть результат int.
Ключове слово await використовується для асинхронного очікування завершення методу Task.Run. Метод Task.Run використовується для виконання важких обчислень в окремому потоці, що запобігає блокуванню потоку користувацького інтерфейсу.
Зробивши метод асинхронним, його можна виконувати в окремому потоці, що може поліпшити чуйність програми.
Ось приклад асинхронного методу, який асинхронно зчитує файл:
1 2 3 4 5 6 7 |
static async Task<string> ReadFileAsync(string filePath) { using (var reader = new StreamReader(filePath)) { return await reader.ReadToEndAsync(); } } |
У цьому прикладі сигнатура методу містить ключове слово async, а тип, що повертається, – Task<string>. Усередині методу ми створюємо StreamReader і використовуємо метод ReadToEndAsync для асинхронного читання всього файлу. Потім ми використовуємо ключове слово await для асинхронного очікування результату виклику методу і повертаємо результат у вигляді рядка.
Виклик і отримання результату від такого методу матиме такий вигляд:
1 2 3 4 |
static async Task Main() { string textFromFile = await ReadFileAsync(@"D:/folder/file.txt"); } |
Припустімо, у вас є метод, який повинен виконати кілька викликів веб-служби і агрегувати результати. Виконання цього методу може зайняти деякий час, і ви хочете бути впевнені, що він не заблокує потік, що викликає.
Шановні ентузіасти програмування на C#!
З найкращими побажаннями,
[Леонід/ Dijix Company]
Ось приклад того, як можна зробити подібний метод асинхронним:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
static async Task<List<string>> GetAggregatedDataAsync(List<string> urls) { var results = new List<string>(); foreach (var url in urls) { // Make an asynchronous web service call var response = await CallWebServiceAsync(url); // Process the response var processedResponse = ProcessResponse(response); // Add the processed response to the results list results.Add(processedResponse); } return results; } static async Task<string> CallWebServiceAsync(string url) { using (var httpClient = new HttpClient()) { var response = await httpClient.GetAsync(url); var content = await response.Content.ReadAsStringAsync(); return content; } } static string ProcessResponse(string response) { // Do some processing on the response and return the processed result return response.ToUpper(); } |
У цьому прикладі метод GetAggregatedDataAsync позначений як async і повертає Task<List<string>>. Це вказує на те, що метод є асинхронним і після завершення поверне List<string>.
Цикл foreach у GetAggregatedDataAsync використовує ключове слово await для асинхронного виклику методу CallWebServiceAsync. Це гарантує, що метод не заблокується в очікуванні завершення виклику веб-служби.
Метод CallWebServiceAsync також позначений як async і повертає Task<string>. Це вказує на те, що метод є асинхронним і після завершення поверне рядок.
Нарешті, метод ProcessResponse – це синхронний метод, який виконує деяку обробку відповіді веб-сервісу. Оскільки цей метод є синхронним, його не потрібно позначати як асинхронний.
Приклад використання:
1 2 3 4 5 6 7 8 9 10 11 |
static async Task Main() { List<string> urls = new List<string>() { "https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-10#improvements-of-structure-types", "https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-10#lambda-expression-improvements", "https://learn.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-10#extended-property-patterns" }; List<string> result = await GetAggregatedDataAsync(urls); } |
Зробивши необхідні методи асинхронними, ви можете гарантувати, що метод GetAggregatedDataAsync виконуватиметься асинхронно і не блокуватиме потік, що викликає. Це може допомогти поліпшити продуктивність і чуйність вашої програми.
Так само вам може бути цікава попередня стаття – Як зробити авторизацію в Asp.Net.
Ви хочете навчитися писати код мовою програмування C#?
Створювати різні інформаційні системи, що складаються з сайтів, мобільних клієнтів, десктопних додатків, телеграм-ботів тощо.
Переходьте до нас на сторінку Dijix і ознайомтеся з умовами навчання, ми спеціалізуємося тільки на індивідуальних заняттях, як для початківців, так і для просунутих програмістів. Ви можете взяти як одне заняття для опрацювання питання, що вас цікавить, так і кілька, для більш щільної роботи. Завдяки особистому кабінету, кожен студент підвищить якість свого навчання, у вашому розпорядженні:
- Доступ до пройденого матеріалу
- Тематичні статті
- Бібліотека книг
- Онлайн тестування
- Спілкування в закритих групах