Giới thiệu về luồng trong C#

Thread là gì?

Một thread được định nghĩa như là một đường thực thi (execution path) của một chương trình. Mỗi Thread định nghĩa một dòng điều khiển duy nhất. Nếu application của bạn gồm các hoạt động phức tạp và tốn thời gian, thì nó thường là rất hữu ích khi thiết lập các execution path hoặc Thread, với mỗi Thread thực hiện một công việc cụ thể.

Các Thread là các tiến trình nhẹ. Một ví dụ phổ biến của sự sử dụng Thread là sự triển khai lập trình tương tranh (concurrent programming) bởi các hệ điều hành hiện đại. Sử dụng các Thread tiếp kiệm sự hao phí của CPU cycle và tăng hiệu quả của một application.

Tới chương này, chúng ta đã viết các chương trình mà một Thread đơn chạy như là một tiến trình đơn, đó là trình chạy thể hiện của application. Tuy nhiên, theo cách này, application có thể thực hiện một công việc tại một thời điểm. Để làm nó thực thi nhiều hơn một tác vụ tại một thời điểm, nó có thể được phân chia thành các Thread nhỏ hơn.

Vòng đời của Thread

Vòng đời của một Thread bắt đầu khi một đối tượng của lớp System.Threading.Thread được tạo và kết thúc khi Thread đó được kết thúc hoặc hoàn thành việc thực thi.

Dưới đây là các trạng thái đa dạng trong vòng đời của một Thread trong C#:

  • Unstarted State: Nó là tình huống khi instance của Thread được tạo, nhưng phương thức Start chưa được gọi.
  • Ready State: Nó là tình huống khi Thread đó sẵn sàng để chạy và đợi CPU cycle.
  • Not Runnable State: Một Thread là không thể thực thi (not executable), khi:
    • Phương thức Sleep đã được gọi.
    • Phương thức Wait đã được gọi.
    • Bị ngăn chặn bởi hoạt động I/O.
  • Dead State: Nó là tình huống khi Thread hoàn thành sự thực thi hoặc bị hủy bỏ.

Main Thread trong C#

Trong C#, lớp System.Threading.Thread được sử dụng để làm việc với các Thread. Nó cho phép tạo và truy cập các Thread riêng biệt trong một Multithreaded Application. Thread đầu tiên để được thực thi trong một tiến trình được gọi là Main Thread trong C#.

Khi một chương trình C# bắt đầu thực thi, Main Thread được tự động tạo ra. Các Thread, được tạo bởi sử dụng lớp Thread, được gọi các Thread con của Main Thread. Bạn có thể truy cập một Thread bởi sử dụng thuộc tính CurrentThread của lớp Thread.

Dưới đây là chương trình ví dụ minh họa cho sự thực thi Main Thread trong C#:

using System; 
using System.Threading;
namespace MultithreadingApplication 
{
   class MainThreadProgram
   {
      static void Main(string[] args)
      {
         Thread th = Thread.CurrentThread;
         th.Name = "MainThread";
         Console.WriteLine("This is {0}", th.Name);
         Console.ReadKey();
      }
   } 
}

When the above code is compiled and executed, it produces the following result:

This is MainThread

Thuộc tính và Phương thức của lớp Thread trong C#

Bảng dưới liệt kê một số thuộc tính được sử dụng phổ biến nhất của lớp Thread trong C#:

THUỘC TÍNH MIÊU TẢ
CurrentContext Lấy ngữ cảnh (context) hiện tại mà trong đó Thread đang thực thi
CurrentCulture Lấy hoặc thiết lập culture gồm language, date, time, currency, … cho Thread hiện tại
CurrentPrinciple Lấy hoặc thiết lập nguyên lý hiện tại của Thread
CurrentThread Lấy Thread đang chạy hiện tại
CurrentUICulture Lấy hoặc thiết lập culture hiện tại được sử dụng bởi Resource Manager để tìm kiếm cho Resource cụ thể tại runtime
ExecutionContext Lấy một đối tượng ExecutionContext mà chứa thông tin về các context đa dạng của Thread hiện tại
IsAlive Lấy một giá trị chỉ trạng thái thực thi của Thread hiện tại
IsBackground Lấy hoặc thiết lập một giá trị chỉ rằng có hay không một Thread là Background Thread
IsThreadPoolThread Lấy một giá trị chỉ rằng có hay không một Thread là của Managed Thread Pool
ManagedThreadId Lấy một định danh duy nhất cho Managed Thread hiện tại
Name Lấy hoặc thiết lập tên của Thread
Priority Lấy hoặc thiết lập một giá trị chỉ quyền ưu tiên của một Thread
ThreadState Lấy một giá trị chứa các trạng thái của Thread hiện tại

Bảng này liệt kê các phương thức được sử dụng phổ biến nhất của lớp Thread trong C#:

STT PHƯƠNG THỨC
1 public void Abort()

Tạo một ThreadAbortException trong Thread mà trên đó nó được triệu hồi, để bắt đầu tiến trình kết thúc Thread đó. Gọi phương thức này thường kết thúc Thread

2 public void Interrupt()

Interrupt (ngắt) một Thread mà trong trạng thái WaitSleepJoin

3 public void Join()

Chặn Thread đang gọi tới khi một Thread kết thúc, trong khi tiếp tục thực hiện COM và SendMessage Pumping. Phương thức này có các mẫu được nạp chồng khác nhau

4 public void Start()

Bắt đầu một Thread

5 public static void Sleep(int millisecondsTimeout)

Làm Thread dừng trong một khoảng thời gian

6 public static bool Yield()

Làm Thread đang gọi chuyển sự thực thi cho Thread khác mà đã sẵn sàng để chạy trên Processor hiện tại. Hệ điều hành chọn Thread để chuyển tới

Complete and Continue