Blog Dla Młodszych Programistów C#/.NET

poniedziałek, 13 stycznia 2025

Wprowadzenie


Dzisiaj zagłębimy się w temat, który jest kluczowy dla tworzenia wydajnych i responsywnych aplikacji w C# i .NET. Asynchroniczność pozwala na efektywne wykorzystanie zasobów systemowych i tworzenie aplikacji, które płynnie obsługują wiele zadań jednocześnie.

Asynchroniczność w C#: Podstawy Programowania Wielowątkowego

Co to jest programowanie asynchroniczne?


Programowanie asynchroniczne to technika, która umożliwia wykonywanie długotrwałych operacji bez blokowania głównego wątku aplikacji. W C# mamy do dyspozycji słowa kluczowe async i await, które znacznie upraszczają pracę z kodem asynchronicznym.


Podstawowe koncepcje


    1. Task: Reprezentuje asynchroniczną operację.
    2. async: Słowo kluczowe używane do deklaracji metody asynchronicznej.
    3. await: Słowo kluczowe używane do oczekiwania na zakończenie operacji asynchronicznej.


Przykłady kodu


1. Prosta metoda asynchroniczna

Zacznijmy od prostego przykładu:

using System;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("Rozpoczynam operację asynchroniczną...");
await AsynchronicznaOperacja();
Console.WriteLine("Operacja zakończona.");
}

static async Task AsynchronicznaOperacja()
{
await Task.Delay(2000); /* Symulacja długotrwałej operacji */
Console.WriteLine("Operacja asynchroniczna wykonana!");
}
}


2. Pobieranie danych z internetu


Oto przykład asynchronicznego pobierania danych z internetu:

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
string url = "https://api.example.com/data";
string data = await PobierzDaneAsync(url);
Console.WriteLine($"Pobrane dane: {data}");
}

static async Task<string> PobierzDaneAsync(string url)
{
using (HttpClient client = new HttpClient())
{
return await client.GetStringAsync(url);
}
}
}


3. Równoległe wykonywanie wielu zadań

Możemy również wykonywać wiele zadań równolegle:

using System;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
Task<int> task1 = DlugotrwalaOperacja(1, 2000);
Task<int> task2 = DlugotrwalaOperacja(2, 1000);
Task<int> task3 = DlugotrwalaOperacja(3, 3000);

int[] wyniki = await Task.WhenAll(task1, task2, task3);

Console.WriteLine($"Wyniki: {string.Join(", ", wyniki)}");
}

static async Task<int> DlugotrwalaOperacja(int id, int delay)
{
await Task.Delay(delay);
Console.WriteLine($"Operacja {id} zakończona");
return id * 10;
}
}


Zaawansowane techniki


1. Obsługa wyjątków w kodzie asynchronicznym

static async Task Main(string[] args)
{
try
{
await RyzykownaOperacjaAsync();
}
catch (Exception ex)
{
Console.WriteLine($"Wystąpił błąd: {ex.Message}");
}
}

static async Task RyzykownaOperacjaAsync()
{
await Task.Delay(1000);
throw new Exception("Coś poszło nie tak!");
}


2. Anulowanie operacji asynchronicznych

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
using (var cts = new CancellationTokenSource())
{
Task operacja = DlugaOperacjaAsync(cts.Token);

/* Anuluj operację po 3 sekundach */
await Task.Delay(3000);
cts.Cancel();

try
{
await operacja;
}
catch (OperationCanceledException)
{
Console.WriteLine("Operacja została anulowana.");
}
}
}

static async Task DlugaOperacjaAsync(CancellationToken token)
{
for (int i = 0; i < 10; i++)
{
token.ThrowIfCancellationRequested();
await Task.Delay(1000, token);
Console.WriteLine($"Krok {i + 1}");
}
}
}


Dobre praktyki


    1. Używaj async/await konsekwentnie: Jeśli metoda jest asynchroniczna, powinna być oznaczona jako async i używać await.
    2. Unikaj blokowania: Nie używaj .Result lub .Wait() na taskach, zamiast tego używaj await.
    3. Obsługuj wyjątki: Zawsze pamiętaj o prawidłowej obsłudze wyjątków w kodzie asynchronicznym.
    4. Używaj CancellationToken: Pozwala na eleganckie anulowanie długotrwałych operacji.
    5. Testuj kod asynchroniczny: Upewnij się, że Twój kod asynchroniczny działa poprawnie w różnych scenariuszach.


Podsumowanie


Programowanie asynchroniczne w C# to potężne narzędzie, które pozwala na tworzenie wydajnych i responsywnych aplikacji. Dzięki async i await, kod asynchroniczny staje się czytelny i łatwy w utrzymaniu. Jeśli chcesz pogłębić swoją wiedzę na temat programowania asynchronicznego oraz innych zaawansowanych technik w C# i .NET, zachęcam do sprawdzenia mojego szkolenia online "Zostań Programistą .NET". W szkoleniu tym szczegółowo omawiamy nie tylko asynchroniczność, ale także wiele innych kluczowych aspektów programowania, które pomogą Ci stać się skutecznym deweloperem .NET. Dziękuję za uwagę! Jeśli masz pytania lub chcesz podzielić się swoimi doświadczeniami z programowaniem asynchronicznym w C#, zostaw komentarz poniżej. Powodzenia w Twojej przygodzie z programowaniem!

Autor artykułu:
Kazimierz Szpin
Kazimierz Szpin
CTO & Founder - FindSolution.pl
Programista C#/.NET. Specjalizuje się w Blazor, ASP.NET Core, ASP.NET MVC, ASP.NET Web API, WPF oraz Windows Forms.
Autor bloga ModestProgrammer.pl
Dodaj komentarz

Wyszukiwarka

© Copyright 2025 modestprogrammer.pl. Wszelkie prawa zastrzeżone. Regulamin. Polityka prywatności. Design by Kazimierz Szpin