Lập Trình Multi Thread C# Sử Dụng Parallel Chạy Song Song Các Tác Vụ

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 C# Là Gì