Xử Lý đồng Bộ Thread Với Async Và Await Trong C# - Học Lập Trình ...
Có thể bạn quan tâm
Trong bài viết sẽ đề cập đến vấn đề sử dụng từ khóa async và await giúp lập trình viên C# có thể tiếp cận và vận dụng tốt nhất tính năng này của WinRT.
WinRT được xây dựng dựa trên sự chú trọng về xử lí asynchoronous (tạm dịch là không đồng bộ) của các tiến trình, đó là điểm nhấn đáng chú ý của WinRT, bằng việc phân luồng xử lí và sắp xếp các luồng một cách hợp lí nhất, giúp WinRT ngày càng chiếm lấy cảm tình của người dùng, bởi lẽ cách xử lí ít tốn time của CPU, khá mượt mà và dể chịu của nó.
Như đề cập ở tiêu đề, khác Synchoronous (đồng bộ hóa), Asynchoronous cho phép chương trình thực hiện các công việc khác trong khi chờ Task thực hiện.


Xét ví dụ dưới đây:
protected void btnSubmit_Click(object sender, RoutedEventArgs e) { int res = 0; var task = ThreadPool.RunAsync(delegate { res = DoSomeThing(); }); task.Completed = delegate(IAsyncAction asyncAction, AsyncStatus asyncStatus) { btnSubmit.Content = res.ToString(); //lỗi } }| 123456789 | protectedvoidbtnSubmit_Click(objectsender,RoutedEventArgse){intres=0;vartask=ThreadPool.RunAsync(delegate{res=DoSomeThing();});task.Completed=delegate(IAsyncAction asyncAction,AsyncStatus asyncStatus){btnSubmit.Content=res.ToString();//lỗi}} |
Ví dụ trên thực hiện một công việc đơn giản: tạo một Thread nằm trong ThreadPool sau đó thực hiện hàm DoSomeThing() trả giá trị trở về cho res, sau khi công việc hoàn tất, gán giá trị của res trở về cho btnSubmit.Content (Ví dụ thường thấy trong thao tác Client để chờ trả lời từ Server hoặc Webservices) . Tuy nhiên: + không phải lúc nào hàm DoSomeThing() cũng có giá trị đúng đắn. + Trong lúc tạo CallBack cho task ta đã sinh ra một Thread ko thuộc UI, không thể thay đổi giá trị của các UI (button) Khi đó: + AsyncStatus cung cấp các giá trị cho biết kết quả của quá trình thực hiện. + Đưa đoạn xử lý vào UI Thread. Ta có đoạn code dưới đây:
protected void btnSubmit_Click(object sender, RoutedEventArgs e) { int res = 0; var task = ThreadPool.RunAsync(delegate { res = DoSomeThing(); }); task.Completed = delegate(IAsyncAction asyncAction, AsyncStatus asyncStatus) { Dispatcher.RunAsync(CoreDispatcherPriority.Normal, delegate { switch (asyncStatus) { case AsyncStatus.Completed: btnSubmit.Content = res.ToString(); break; case AsyncStatus.Error: btnSubmit.Content = asyncAction.ErrorCode.Message; break; case AsyncStatus.Canceled: btnSubmit.Content = "A task was stupid"; break; } }); } }| 1234567891011121314151617181920212223 | protectedvoidbtnSubmit_Click(objectsender,RoutedEventArgse){intres=0;vartask=ThreadPool.RunAsync(delegate{res=DoSomeThing();});task.Completed=delegate(IAsyncAction asyncAction,AsyncStatus asyncStatus){Dispatcher.RunAsync(CoreDispatcherPriority.Normal,delegate{switch(asyncStatus){caseAsyncStatus.Completed:btnSubmit.Content=res.ToString();break;caseAsyncStatus.Error:btnSubmit.Content=asyncAction.ErrorCode.Message;break;caseAsyncStatus.Canceled:btnSubmit.Content="A task was stupid";break;}});}} |
CoreDispatcher gắn kết thao tác xử lí vào UI, từ đó cho phép thao tác với UI. asyncStatus cho phép ta xác định kết quả thực hiện của thread bao gồm Cancelled, Complete, Error. Việc thao tác như trên gây nhiều phiền toái và khá “cơ bắp”, khiến cho việc xử lí trở nên rườm rà phức tạp. Đối với WinRT ta có thể thao tác đơn giản như sau:
protected async void btnSubmit_Click(object sender, RoutedEventArgs e) { try { int res = 0; //(1) await ThreadPool.RunAsync(delegate { res = DoSomeThing(); }); //(2) btnSubmit.Content = res.ToString(); //(3) } catch {} }| 12345678910 | protectedasync voidbtnSubmit_Click(objectsender,RoutedEventArgse){try{intres=0;//(1)await ThreadPool.RunAsync(delegate{res=DoSomeThing();});//(2)btnSubmit.Content=res.ToString();//(3)}catch{}} |
Trong đoạn code trên, sau khi thực hiện dòng lệnh (1), ThreadPool tạo và thực thi tìm giá trị của res thông qua hàm DoSomeThing(). sau đó đợi đến khi quá trình kết thúc thì gán giá trị cho Content Mặt khác, nếu muốn trả về giá trị của một Task được gọi thực thi, WinRT cung cấp bộ chuyển dử liệu với từ khóa Task. ta xét ví dụ dưới đây.
protected async Task DoSomeThing() { int res = await GetInformation("http://localhost/customerID"); return res; }| 12345 | protectedasync Task DoSomeThing(){intres=await GetInformation("http://localhost/customerID");returnres;} |
Cảm ơn các bạn đã đọc bài hy vọng qua bài viết này sẽ giúp các bạn học lập trình C# hiểu rõ hơn vấn đề sử dụng từ khóa async và await để bạn có thể tiếp cận và vận dụng tốt nhất tính năng này của WinRT.
5 / 5 ( 11 votes )Bài viết liên quan:
- Học lập trình c# – Back up DataBase
- Những chú ý liên quan đến lập trình C#
- C# – Kĩ thuật Reflection trong .Net
- Học lập trình c# – Validation sử dụng Error Provider
Từ khóa » Cách Sử Dụng Await Trong C#
-
Lập Trình Bất đồng Bộ Trong C# - Viblo
-
Lập Trình Bất đồng Bộ Asynchronou C# C Sharp Với ...
-
Async Và Await Trong C# 5.0 +
-
Thread Và Tasks Trong C# Sử Dụng Như Thế Nào? - CodeLearn
-
C# — Cách Thức Và Thời Điểm Sử Dụng ' Async Await C# Là Gì
-
[C#] Sử Dụng Từ Khóa Async Và Await Trong Lập ... - Lập Trình VB.NET
-
Async Await C# Là Gì? Lập Trình Bất Đồng Bộ C# - Asiana
-
Lập Trình Bất đồng Bộ Asynchronous, Tạo Phương Thức ... - YouTube
-
Async Await Giá Như Tôi đọc được Bài Viết Này Sớm Hơn - Anonystick
-
[C#] Sử Dụng Từ Khóa Async Và Await Trong Lập Trình ...
-
Các đặc Trưng Hữu ích Trong C# (Phần 3) – Lập Trình Không đồng Bộ ...
-
Async Await C# Là Gì - Cẩm Nang Tiếng Anh
-
Cách Thức Và Thời Điểm Sử Dụng ' Async Await C# Là Gì - Loto09
-
[WPF] Hướng Dẫn Sử Dụng Await Và Async Trong WPF - C# Căn Bản