36 (Multithreading) async – await

Lập trình bất đồng bộ (asynchronous programming) trong C# cho phép các tác vụ được thực hiện song song mà không làm gián đoạn luồng chính của ứng dụng. Điều này đặc biệt hữu ích khi xử lý các tác vụ tốn thời gian như truy cập mạng, đọc/ghi tệp lớn hoặc truy vấn cơ sở dữ liệu.

1. Mô hình lập trình bất đồng bộ theo tác vụ (Task-based Asynchronous Pattern – TAP)

Trong .NET, Task-based Asynchronous Pattern (TAP) là mô hình phổ biến để triển khai lập trình bất đồng bộ. TAP sử dụng lớp Task và các từ khóa async, await để quản lý và thực thi các tác vụ bất đồng bộ một cách hiệu quả.

a. Lớp Task

Lớp Task đại diện cho một tác vụ bất đồng bộ. Nó cung cấp các phương thức và thuộc tính để theo dõi trạng thái, kết quả và xử lý ngoại lệ của tác vụ.

b. Từ khóa asyncawait

  • async: Được sử dụng để khai báo một phương thức là bất đồng bộ. Phương thức này có thể chứa các lệnh gọi bất đồng bộ và sử dụng từ khóa await.
  • await: Được sử dụng để chờ đợi kết quả của một tác vụ bất đồng bộ. Khi gặp await, luồng hiện tại sẽ tạm dừng cho đến khi tác vụ hoàn thành, nhưng không khóa ứng dụng, cho phép các tác vụ khác tiếp tục thực thi.

2. Ví dụ về lập trình bất đồng bộ với TAP

Dưới đây là ví dụ về việc sử dụng asyncawait trong C#:

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

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Bắt đầu tải dữ liệu...");
        string data = await DownloadDataAsync("https://example.com");
        Console.WriteLine("Dữ liệu đã tải:");
        Console.WriteLine(data);
    }

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

Giải thích:

  • Phương thức Main được đánh dấu với async và trả về Task, cho phép sử dụng await bên trong.
  • Phương thức DownloadDataAsync thực hiện việc tải dữ liệu từ URL bằng HttpClient. Phương thức này cũng được đánh dấu với async và trả về Task<string>.
  • Từ khóa await được sử dụng trước client.GetStringAsync(url) để chờ kết quả tải dữ liệu mà không khóa luồng chính.

3. Lợi ích của lập trình bất đồng bộ với TAP

  • Hiệu suất cao: Cho phép ứng dụng thực hiện nhiều tác vụ đồng thời, tận dụng tối đa tài nguyên hệ thống.
  • Trải nghiệm người dùng tốt hơn: Ứng dụng không bị treo hoặc không phản hồi khi thực hiện các tác vụ tốn thời gian.
  • Dễ bảo trì: Sử dụng asyncawait giúp mã nguồn rõ ràng, dễ đọc và dễ bảo trì hơn so với việc sử dụng các callback hoặc các mô hình bất đồng bộ phức tạp khác.

4. Lưu ý khi sử dụng lập trình bất đồng bộ

  • Xử lý ngoại lệ: Cần đảm bảo các ngoại lệ trong các phương thức bất đồng bộ được xử lý đúng cách để tránh lỗi không mong muốn.
  • Quản lý hủy tác vụ: Sử dụng CancellationToken để cho phép hủy các tác vụ bất đồng bộ khi cần thiết, giúp ứng dụng linh hoạt và phản hồi nhanh hơn.

Việc áp dụng lập trình bất đồng bộ theo mô hình tác vụ trong C# sẽ giúp bạn xây dựng các ứng dụng hiệu quả, đáp ứng tốt và dễ bảo trì.

Để lại một bình luận 0

Your email address will not be published. Required fields are marked *