Async và await trong C# 5.0 +

So với các phương pháp lập trình truyền thông, lập trình bất đồng bộ ra đời nhằm để hạn chế nghẽn cổ chai (thuật ngữ bottlenecks) và nâng cao tính phản hồi của toàn ứng dụng.

Khái niệm bất đồng bộ hoàn toàn không mới, và được áp dụng rất triệt để trên các hệ thống đa nhiệm, hay đơn giản như hệ thống GUI bất kỳ đều áp dụng phương pháp lập trình bất đồng bộ. Async và await là công cụ cực kỳ hiệu quả để giải quyết các vấn đề xử lý bất đồng bộ, có thể nói async và await là một trong những điểm nhấn của .NET 4.5 và Visual Studio 2015. Hãy cùng xem async và await có gì thú vị nhé.

.NET Framework đưa ra hai từ khóa async và await, đều rất mới mẻ, được giới thiệu bắt đầu từ phiên bản Visual Studio 2012 (Và từ WP 7.5 SDK), nhằm hỗ trợ việc giải quyết vấn đề xử lý bất đồng bộ. Cặp từ khóa này hỗ trợ chúng ta lập trình dễ dàng hơn – đồng thời tiết kiệm công sức để viết, debug và bảo trì.

Async tăng tính phản hồi cho ứng dụng

Kỹ thuật lập trình bất đồng bộ cần thiết cho các phương thức trong đó có blocking (tức là phải chờ để hoàn tất), ví dụ: Khi ứng dụng có truy cập đến các trang web, khi ứng dụng cần đọc multimedia từ bộ nhớ, … Trong một số trường hợp cụ thể, việc này bị chậm hoặc bị delayed. Nếu các phương thức trên bị block với một process đồng bộ, toàn bộ ứng dụng đều phải dừng lại và đợi. Trong một ứng dụng bất đồng bộ, ứng dụng vẫn có thể tiếp tục chạy bình thường với các tác vụ khác mà không phụ thuộc vào việc dữ liệu web đã được lấy về xong hay chưa. Từ đó dẫn đến việc tăng tính phản hồi cho ứng dụng.

Sử dụng async, await khác biệt như thế nào

Trước tiên, chúng ta sẽ cùng nhau tìm hiểu một ví dụ: Trong ví dụ này, chúng ta sẽ đi lấy nội dung của file myFile.txt đặt trên web tại đường dẫn http://www.myurl.com/myFile.txt

+ Cách 1: Lập trình đồng bộ

var client = new WebClient();

// Download data.

var textData = client.DownloadString("http://www.myurl.com/myFile.txt");

// Write values.

Debug.WriteLine(textData);                                                                                                             

Việc lập trình đồng bộ thông thường, dòng Debug.WriteLine(textData) sẽ được thực hiện ngay khi dòng phương thức client.DownloadString hoàn tất. Tuy nhiên, ở process gọi đoạn code trên sẽ phải dừng lại chờ cho tới khi xử lý xong.

+ Cách 2: Không sử dụng async, await:

void GetWebData() { var client = new WebClient(); client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(loadHTMLCallback); client.DownloadStringAsync(new Uri(“http://www.myurl.com/myFile.txt”)); }

public void loadHTMLCallback(Object sender, DownloadStringCompletedEventArgs e) var textData = (string)e.Result; // Do cool stuff with result Debug.WriteLine(textData); }

 Với xử lý bất đồng bộ không dùng async await, định nghĩa event handler để bắt sự kiện khi tải xong nội dung của file. Sau đó gọi hàm bất đồng bộ để lấy nội dung.

+ Cách 3: Sử dụng async, await

var client = new WebClient()

// Download data.

var textData = await client.DownloadString("http://www.myurl.com/myFile.txt");

// Write values.

Debug.WriteLine(textData);    

Điểm khác biệt


Thứ nhất, việc xử lý bất đồng bộ 2 thao tác lấy dữ liệu và hiển thị đều được thực hiện trên 1 thread duy nhất. Đây là điểm khác biệt giữa lập trình đồng bộ và lập trình bất đồng bộ.

Việc thêm từ khóa await sẽ tách biệt đoạn code phía sau dòng lệnh có chứa await ra để thực thi ở 1 thread khác khi dòng lệnh đó hoàn tất.

Thứ hai, với việc xử lý bất đồng bộ sử dụng từ khóa async await, chúng ta không cần định nghĩa event handler để bắt sự kiện hoàn tất tác vụ bất đồng bộ. Điều này đồng nghĩa với việc viết code gọn, dễ dàng debug, bảo trì hơn.

Theo dõi http://laptrinhtot.com để tiếp tục theo dõi các loạt bài mới nhất về C# nhé!

Tags: