Lập Trình Multi Thread C# Sử Dụng Parallel Chạy Song Song Các Tác Vụ
Có thể bạn quan tâm
Lớp Parallel thuộc namespace System.Threading.Tasks, nó trừu tượng hóa các thread, lớp này có phương thức tĩnh Parallel.For, Parallel.ForEach để thực hiện vòng lặp for và foreach để chạy song song các tác vụ. Nếu với for và foreach trong C#, thì vòng lặp đó chạy trong một thread, nhưng với Parallel nó sử dụng đa tác vụ, đa tiến trình để thực hiện nội dung lặp. Ngoài ra là Parallel.Invoke để thực hiện một Action có khả năng chạy song song.
Parallel.For có nhiều quá tải, cú pháp bản đơn giản như sau:
ParallelLoopResult result = Parallel.For(i1, i2, task);Vòng lặp chạy (biến chạy) từ số nguyên i1 đến i2, mỗi lần lặp nó sẽ thực hiện Action task
task là một delegate, kiểu Action<int> có nghĩa nó làm phương thức trả về void, có một tham số kiểu int, tham số này là biến chạy. Ví dụ đây là một action phù hợp cho Parallel.For
Action<int> action = (int x) => { // Doing somthing here ... };result đối tượng lớp ParallelLoopResult trả về từ Paralell.For, thuộc tính ParallelLoopResult.IsCompleted cho biết vòng lặp đã được duyệt qua hết, tất cả các task đã khởi chạy.
Ví dụ: Source Code
class Program { //In thông tin, Task ID và thread ID đang chạy public static void PintInfo(string info) => Console.WriteLine($"{info, 10} task:{Task.CurrentId,3} " + $"thread: {Thread.CurrentThread.ManagedThreadId}"); // Phương thức phù hợp với Action<int>, được làm tham số action của Parallel.For public static void RunTask(int i) { PintInfo($"Start {i,3}"); Task.Delay(1000).Wait(); // Task dừng 1s - rồi mới chạy tiếp PintInfo($"Finish {i,3}"); } public static void ParallelFor() { ParallelLoopResult result = Parallel.For(1, 20, RunTask); // Vòng lặp tạo ra 20 lần chạy RunTask Console.WriteLine($"All task start and finish: {result.IsCompleted}"); } static void Main(string[] args) { ParallelFor(); Console.WriteLine("Press any key ..."); Console.ReadKey(); } }
Từ kết quả trên bạn thấy:
- Lệnh Parallel.For khởi chạy song song nhiều tác vụ (thời điểm bắt đầu của mỗi tác vụ không giống nhau, có những tác vụ đã kết thúc thì tác vụ sau mới chạy, nó có thể phụ thuộc vào tài nguyên hệ thống RAM, CPU ...
- Một task nó có chạy trên một thread nào đó (chứ không phải mỗi task một thread), một thread có thể sử dụng bởi nhiều task. Ví dụ nhìn vào kết quả, task với i = 1, và task với id = 15 chạy trên một thread
- Khi tất vòng lặp duyệt qua hết, có nghĩa là đã khởi chạy hết các tác vụ, nếu tất cả các tác vụ trả về (khi chạy xong hàm Action, hoặc ngay khi gọi Action nếu Action là async - hãy xem kỹ phần async - await ở phần trước) thì kết quả lưu vào result với result.IsCompleted là true
Từ khóa » Thread Trong C# Là Gì
-
C# – Cơ Bản Về Thread | YinYang's Programing Blog
-
Thread Và Tasks Trong C# Sử Dụng Như Thế Nào? - CodeLearn
-
Multi Threading (đa Luồng) Trong C# | How Kteam
-
Đa Luồng (Multithread) Trong C# - Học Lập Trình C# Online - VietTuts
-
Hướng Dẫn Lập Trình đa Luồng Trong C# - Openplanning
-
Tìm Hiểu C# Và ứng Dụng: Thread Và Sự đồng Bộ
-
Thread Trong C# – Transinhs
-
Luồng Thực Thi (thread), Lập Trình đa Luồng (multithreading) | Tự Học ICT
-
Chi Tiết Blog Multithreading Trong Lập Trình - Vimentor
-
Thread Và Tasks Trong C# Sử Dụng Như Thế Nào? - Chickgolden
-
Thread In C# Đa Luồng Trong C# Thread.Sleep Thread.Join Thread ...
-
Lập Trình Bất đồng Bộ Trong C# - Viblo
-
Lock Statement - C# Reference | Microsoft Docs
-
Đa Luồng (Multithread) Trong C# - Vay Tiền Online Bằng CMND