ASYNC AWAIT C# LÀ GÌ

  -  

Tìm hiểu về lập trình bất nhất quán, áp dụng lớp Task để chạy task, khám phá trường đoản cú khóa async với await - áp dụng bất đồng bộ


Lập trình bất nhất quán asynchronous

Từ .NET Framework 4.5 nó cung ứng thỏng viện mang tên Task Parallel Library (TPL) - TPL góp thiết kế chạy tuy vậy song (nhiều luồng) thuận tiện hơn. Trong C# đôi khi nó thêm vào hai tự khóa là async và await, đây là nhị trường đoản cú khóa chủ yếu nhằm áp dụng trong thiết kế bất đồng điệu.

Bạn đang xem: Async await c# là gì

Lập trình bất đồng điệu (asynchronous) là một trong phương pháp nhưng khi điện thoại tư vấn nó chạy nghỉ ngơi chế độ nền (tương quan đến một tiến trình, task), trong lúc đó quy trình Call nó không bị khóa - block. Trong .NET tất cả thực thi một vài quy mô lập trình bất đồng nhất như Asynchronous pattern, mẫu mã bất đồng nhất theo sự kiện và theo tác vụ (TAPhường - task-based asynchronous pattern)

Phần này đang nói đến TAPhường. - task-based asynchronous pattern - chiêu tập hình lập trình bất nhất quán phổ cập bên trên .NET hiện thời.

Lập trình đồng nhất synchronous

Bình hay, Khi thiết kế call một cách làm nào đó thì thủ tục kia chạy và hoàn thành thì những chiếc code tiếp theo sau lời Điện thoại tư vấn cách tiến hành đó new được xúc tiến, sẽ là chạy đồng bộ, tức là thread Hotline cách thức bị khóa lại cho đến khi phương thức xong xuôi.


Thử xem ví dụ đơn giản và dễ dàng sau:

DownloadWebsite01.cs

using System;using System.Net;using System.Threading;namespace CS021_ASYNCHRONOUS public class DownloadWebsite01 public static string DownloadWebpage (string url, bool showresult) using (var client = new WebClient ()) Console.Write ("Starting download ..."); string nội dung = client.DownloadString (url); Thread.Sleep (3000); if (showresult) Console.WriteLine (content.Substring (0, 150)); return content; public static void TestDownloadWebpage() string url = "https://code.visualstudio.com/"; DownloadWebpage(url, true); Console.WriteLine("Do somthing ..."); Hãy Điện thoại tư vấn TestDownloadWebpage() trong hàm main nhằm kiểm soát.

Phương thơm thức DownloadWebpage áp dụng lớp WebClient nhằm cài về một website, trả về chuỗi câu chữ trang.

khi chạy, thì lời Điện thoại tư vấn DownloadWebpage(url, true);, thủ tục này thực hành xong xuôi thì mẫu codeConsole.WriteLine("Do somthing ..."); mới được thi hành.

Vấn đề là khi DownloadWebpage(url, true); chạy, nó sẽ khóa thread hotline nó, làm cho cho các dòng code tiếp theo sau đề nghị đợi, nếu hàm kia thi hành mất không ít thời hạn (đặc biệt là những làm việc gọi stream - hiểu tệp tin, liên kết website, liên kết DataBase ...) - trong những lúc tài nguyên vẫn đầy đủ để triển khai những việc khác - thì chương trình vẫn tiếp tục yêu cầu đợi cách làm trên hoàn thành thì mới thi hành được tác vụ khác - đặt biệt là khi Call phương thức trong những tiến trình UI, bối cảnh người dùng không thúc đẩy được.

Xem thêm: Hướng Dẫn Cách Tải Game Thời Trang Về Máy Tính Bằng Bluestacks

Để giải quyết vụ việc này, trong những khi đợi cho DownloadWebpage(url, true) thi hành xong, chương trình vẫn thực hiện được các tác vụ khác thì nên cho kỹ thuật lập trình sẵn bất đồng điệu (trước đó call là lập trình sẵn nhiều tiến trình, nhiều luồng)

Lớp Task

Lớp Task nó biểu hiện tác vụ bất đồng bộ, từ bỏ kia ta chạy được code bất đồng hóa. Nếu tác vụ bất đồng hóa kia thi hành xong xuôi tất cả hình trạng trả về thì dùng Task với T là hình dạng trả về.

Cần áp dụng những namespace sau để có thư viện về Task

using System.Threading;using System.Threading.Tasks;Chụ ý hãy tò mò về hàm ủy quyền delegate C# trước

Cú pháp tạo thành đối tượng Task cơ bản

Để tạo nên một Task bạn phải tmê man số là 1 trong hàm delegate ( Func hoặc Action), ví dụ delegate có tên myfunc thìkhởi tạo

Nếu myfunc trả về đẳng cấp T (tức là một Func) thì khởi tạo

Task task = new Task(myfunc); Nếu bắt buộc truyền tđam mê số đến myfunc thì khởi tạo:

// object là đối tượng người sử dụng tđam mê số truyền mang đến myfuncTask task = new Task(myfunc, object); Nếu myfunc ko trả về quý giá (có nghĩa là Action) thì khởi tạo:

// object là đối tượng người tiêu dùng tmê say số truyền cho myfuncTask task = new Task(myfunc); Để chạy Task hotline cách tiến hành Start() của đối tượng người tiêu dùng được tạo nên. Nếubao gồm kết quả trả về thì đọc công dụng trên thuộc tính Result, đề canh cho task hoànthành thì gọi Wait()

Ta đã có tác dụng một ví dụ sử dụng Task tạo ra các 2 các bước con chạy đồng thời:

TestAsync01.cs

using System;using System.Net;using System.Threading;using System.Threading.Tasks;namespace CS021_ASYNCHRONOUS { public class TestAsync01 { // Viết ra màn hình hiển thị thông báo có màu sắc public static void WriteLine (string s, ConsoleColor color) Console.Foregroundmàu sắc = color; Console.WriteLine (s); // Tạo và chạy Task, thực hiện delegate Func (bao gồm dạng hình trả về) public static Task Async1 (string thamso1, string thamso2) { // sản xuất phát triển thành delegate trả về dạng hình string, gồm một tđắm đuối số object Func myfunc = (object thamso) => // Đọc tmê man số (cần sử dụng phong cách động - xem dạng hình cồn để biết đưa ra tiết) dynamic ts = thamso; for (int i = 1; i task = new Task (myfunc, new x = thamso1, y = thamso2 ); task.Start(); // chạy thread // Làm nào đấy sau khoản thời gian chạy Task tại đây Console.WriteLine("Async1: Làm gì đó sau khi task chạy"); return task; // Tạo với chạy Task, áp dụng delegate Action (không phong cách trả về) public static Task Async2 () { Action myaction = () => { for (int i = 1; i Chạy vào hàm main

Console.WriteLine($"" ",5 Thread.CurrentThread.ManagedThreadId,3 MainThread");Task t1 = TestAsync01.Async1("A", "B");Task t2 = TestAsync01.Async2();Console.WriteLine("Làm gì đấy sinh hoạt thread thiết yếu sau khoản thời gian 2 task chạy");// Chờ t1 ngừng và đọc kết quả trả vềt1.Wait();String s = t1.Result;TestAsync01.WriteLine(s, ConsoleColor.Red);// Ngăn cấm đoán thread thiết yếu kết thúc// Nếu thread chủ yếu xong xuôi nhưng t2 đang làm việc nó sẽ ảnh hưởng ngắtConsole.ReadKey();Kết trái chạy

*

Để khởi tạo thành một Task bạn phải tsi số là 1 trong delegate (Func hoặc Action) - phải buộc phải nắm vững về delegate Func cùng Action trước.

Lưu ý: áp dụng Task và Func : lúc khởi tạo thành một task bắt buộc tham sốlà một delegate, khi task chạy ngừng thì gồm hiệu quả trả về phải dùng đến delegate dạng Func,đầu tiên sinh sản Delegate dạng này cùng với cú pháp như sau (trường đúng theo trong Async1 ở trên)

Func func = (object thamso) => // code ... return ...;;Sau đó chế tác Task với cú pháp

Task task = new Task(func, thamso);lúc vẫn tất cả Task, hotline cách tiến hành Start() của chính nó nhằm ban đầu chạy thread, một thread new bất đồng hóa sẽkhởi chạy - nó sẽ không còn khóa thread Call nó - các loại code tiếp sau của thread bao gồm vẫn chạy trong khi Task hiện hành.

lúc Task chạy xong, tác dụng delegate trả về giữ sinh sống ở trong tính Result (task.Result)

Kết quả chạy code trên, hai thread con đang chạy tuy vậy song, trong những lúc thread chủ yếu đường hóng bạn tín đồ dùngbnóng bàn phím.

Cũng để ý Async2 sinh hoạt trên lại dùng Task chứ không hẳn Task, áp dụng khi hàm bất đồng bộ không cầncông dụng trả về, lúc đó lại dùng hàm delegate dạng kích hoạt chứ không cần sử dụng Func, cú pháp:

Action action = () => ;Task task = new Task(action);

async cùng await

Mã trên bạn thấy, Khi đối tượng người dùng Task khởi chạy bằng Start thì thread của Task chạy, cùng hầu hết dòng codesau Start() được xử trí cơ mà không bị khóa lại. Nlỗi đã nói trên, thread chạy - cùng lúc delegate xong công dụng trả vềlưu giữ làm việc task.Result

Vấn đề là lúc truy cập task.Result để đọc kết quả trả về, thì loại code đó sẽ canh cho Task trả thànhđể gọi dẫn mang đến chiếc code kế tiếp không được triển khai - vì chưng thread Hotline lại bị blochồng, ví dụ cập nhật hàm Async1giúp xem rõ điều đó.

public static Task Async1 (string thamso1, string thamso2) { // tạo ra thay đổi delegate trả về loại string, bao gồm một tđam mê số object Func myfunc = (object thamso) => // Đọc tham số (sử dụng hình dạng động - xem đẳng cấp cồn để hiểu chi tiết) dynamic ts = thamso; for (int i = 1; i task = new Task (myfunc, new x = thamso1, y = thamso2 ); task.Start(); // chạy thread // Làm gì đấy sau khi chạy Task tại đây Console.WriteLine("Async1: Làm nào đó sau khi task chạy"); string ketqua= task.Result; // khóa (block) thread cha - đợi task kết thúc Console.WriteLine("Làm gì đó Lúc task đang kết thúc"); return task;

*
khi Async1 được Hotline 1 trường đoản cú thread bao gồm, nó không giống ngôi trường hợptrước - thread chạy nhưng lại hàm ko trả về ngay nhanh chóng - dẫn đếnthread bị khóa - Async2 ko được chạy cho đến Khi thread trong Async1 hoàn thành.

Xem thêm: Yêu Là Gì Mà Người Người Điên Điên Say Say Đến Thế ? Yêu Là Gì Mà Làm Người Điên Điên Say Say Đến Thế

quý khách thấy thread trong Async1 kết thức 2, thì Async2 mới được call 3, thời gian đó task trong nó mới chạy 4

Vậy 2 task trong ASync1 cùng Async2 ko được chạy đồng thời, task này ngừng new chạy được task kia => Lợi ích của đa luồng, bất nhất quán không đủ.

Giờ bạn muốn Lúc gọi Async1(), nó trả về ngay chớp nhoáng (tức là không khóa thread gọi nó, tuy nhiên bước đầu chạy một task) - trong những lúc bên phía trong Async1() vẫn đảm bảo, gồm có đoạn code chỉ được thihành khi task trong nó xong (đoạn code vùng sau string ketqua = task.Result;)

Hiện nay bạn phải áp dụng cho cặp trường đoản cú khóa async cùng await. Tiến hành làm nlỗi sau:

Cách 1) Thêm vào knhị báo thương hiệu hàm tự khóa async, nó mang đến trình biên dịch biết đây làhàm bất đồng hóa - Lúc Gọi nó - nó trả về tức thì lập tức

public static async Task Async1 (string thamso1, string thamso2)Bước 2) Trong thân của Async1, bắt buộc bao gồm đoạn code đợi task trả thành

await task; // đấy là điểm ko khóa thread chủ yếu, thread chính chạy tiếp, task chạy tiếp