Bài 10: Threading - Nền tảng lập trình C#


Threading là một khái niệm quan trọng trong phát triển phần mềm, hỗ trợ thực hiện nhiều tác vụ tại cùng một thời điểm


  • Khai báo và khởi tạo tiến trình
  • Lập trình không đồng bộ

Threading

  • Threading là một khái niệm quan trọng trong phát triển phần mềm, hỗ trợ thực hiện nhiều tác vụ tại cùng một thời điểm.
  • Hầu hết các tác vụ đều có thời gian chết (downtime), với threading, ta có thể cho bộ xử lý tiếp tục thực hiện công việc trong suốt thời gian đó.
  • Lớp Thread được dùng để tạo và thực thi các tiến trình

Khai báo và khởi tạo tiến trình

  • Các thuộc tính và phương thức của tiến trình
  • Các thao tác trên tiến trình

Các thuộc tính và phương thức của tiến trình

  • Các thuộc tính
    • IsAlive
    • IsBackground
    • IsThreadPoolThread
    • ManagedThread
    • Name
    • Priority
    • ThreadState
  • Các thuộc tính tĩnh (static properties)
    • CurrentContext
    • CurrentPrincipal
    • CurrentThread
  • Các phương thức
    • Abort
    • Interrup
    • Join
    • Resume
    • Start
    • Suspend
  • Các phương thức tĩnh (static methods)
    • BeginCriticalRegion
    • EndCriticalRegion
    • GetDomain
    • GetDomainID
    • ResetAbort
    • Sleep
    • SpinWait
    • VolatileRead
    • VolatileWrite

Các thao tác trên tiến trình

  1. Khởi tạo tiến trình
    • Trong NET Framework namespace .NET Framework, namespace System.Threading chứa các kiểu được dùng để tạo và quản lý đa tiến trình trong ứng dụng
    • Khởi tạo tiến trình:
      • Tạo phương thức không tham số, không kiểu dữ liệu trả về
      • Tạo ủy nhiệm hàm ThreadStart với phương thức vừa tạo
      • Tạo Thread mới với ủy nhiệm hàm ThreadStart vừa tạo
  2. Thực thi tiến trình
    • Tiến trình được khởi tạo sẽ không tự động thực thi.
    • Gọi phương thức Start để thực thi tiến trình
    • Thực thi đa tiến trình
      • Điểm mạnh của Thread là hỗ trợ xử lý đa tiến trình tại cùng 1 thời điểm
  3. Ghép nối các tiến trình
    • Khi khối lượng công việc và thời gian xử lý của mỗi tiến trình tăng, ta sẽ cần tiến trình chính (main thread) chờ cho đến khi xử lý của tiến trình đ ợc hoàn tất thông qua sử dụng phương thức Thread.Join().
  4. Tạm dừng và hủy bỏ vĩnh viễn

Threading priority

  • Hỗ trợ gán/ lấy độ ưu tiên của tiến trình thông qua enum ThreadingPriority.
  • Các giá trị của ThreadingPriority
    • Highest
    • AboveNormal
    • Normal
    • BelowNormal
    • Lowest
  • Thường sử dụng giá trị default là Normal
  • Cân nhắc khi thay đổi độ ưu tiên của tiến trình

Tạm dừng và loại bỏ vĩnh viễn

  • .NET framework tự động dừng và giải phóng tiến trình khi xử lý hoàn tất.
  • Dùng phương thức Thread.Abort() để dừng tiến trình khi có nhu cầu

thread Tạm dừng và loại bỏ vĩnh viễn

  • Dừng tiến trình một cách an toàn : tạo lập g critical region với BeginCriticalRegion và EndReticalRegion.

thread Tạm dừng và loại bỏ vĩnh viễn BeginCriticalRegion và EndReticalRegion

  • So sánh giữa có sử dụng và không sử dụng

thread Tạm dừng và loại bỏ vĩnh viễn  So sánh giữa có sử dụng và không sử dụng

Lập trình không đồng bộ

  • Hỗ trợ từng phần của chương trình được thực thi trên nhiều tiến trình riêng biệt, tương tự mô hình Asynchronous Programming Model (APM).
  • .NET framework hỗ trợ APM qua nhiều lớp có cung cấp phương thức BeginXXX và EndXXX
  • Ví dụ: lớp FileStream có phương thức Read đọc dữ liệu từ stream, nó cũng cung cấp phương thức BeginRead và EndRead hỗ trợ mô hình APM

Ví dụ:

byte[] buffer = new byte[100];
FileStream strm = new FileStream("c:/aaa.txt", p , FileMode.Open,
     FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous);
// gọi xử lý không đồng bộ
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// tiến hành xử lý khác trong khi chờ
// EndRead sẽ bị khóa cho đến khi xử lý không đồng bộ hoàn thành
int numBytes = strm EndRead(result); .EndRead(result);
strm.Close();
Console.WriteLine("Read {0}",numBytes);
Console.WriteLine(BitConverter.ToString(buffer));
  • Cần có cách thực thi tác vụ không đồng bộ và biết khi nào/ nơi nào sẽ gọi phương thức EndXXX.
  • Rendezvous Model: có 3 cách mà APM sử dụng để xử lý khi kết thúc lời gọi phương thức không đồng bộ
    • Wait-Until-Done
      • Cho phép bắt đầu lời gọi phương thức không đồng bộ và thực thi các tác vụ khác.
      • Lời gọi kết thúc phương thức không đồng bộ sẽ bị lock khi phương thức không đồng bộ hoàn toàn xử lý
    • Pooling: Tương tự Wait-Until-Done, nhưng có thăm dò IAsyncResult để biết xử lý đã hoàn tất chưa
// gọi xử lý không đồng bộ
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// thăm dò xử lý hoàn tất chưa ?
While (!result.IsCompleted){
// xử lý khác khi chưa kết thúc lời gọi phương thức không đồng bộ
Thread.Sleep(100);
}
// End sẽ bị khóa đến khi xử lý không đồng bộ hoàn thành
int numBytes = strm.EndRead(result);
    • Callback: Yêu cầu ta chỉ định phương thức callback và bất kỳ trạng thái nào dùng trong phương thức callback để kết thúc lời gọi phương thức không đồng bộ

thread callback modelNgoại lệ và APM

  • Khi dùng APM, các tác vụ có thể phát sinh các ngoại lệ trong quá trình xử lý
  • Các ngoại lệ thường phát sinh trong quá trình gọi phương thức EndXXX
int numBytes=0;
try{
   numBytes=strm EndRead(result); .EndRead(result);
}
Catch (IOException){
   Console.WriteLine("An IO Exception occurred");
}

Lập trình không đồng bộ

  • ThreadPool
    • Trong nhiều trường hợp, tạo tiến trình riêng để thực thi những xử lý không đồng bộ là không cần thiết
    • .NET hỗ trợ các built-in thread pool có thể dùng trong nhiều trường hợp mà ta sẽ có thể cần phải tạo tiến trình xử lý của riêng mình.
    • Các đặc điểm
      • ThreadPool thực thi nhanh
      • Điều khiển số luồng thực thi tại cùng 1 thời điểm
    • Giới hạn số tiến trình trong ThreadPool
      • ThreadPool cho phép chỉ định số lượng tiến trình tối đa và tối thiểu
      • 2 trường hợp cần thay đổi số lượng tiến trình:
        • Starvation
        • Startup thread speed
      • Thay đổi chỉ ảnh hưởng đến tiến trình hiện hành

Giới hạn số tiến trình trong ThreadPool

Starvation : xảy ra khi ứng dụng có quá nhiều tiến trình, vượt quá giới hạn của ThreadPool. Dùng phương thức ThreadPool.SetMaxThreads để thay đổi số lượng tiến trình giới hạn

int threads;
int completionPorts;
ThreadPool.GetMaxThreads(out threads,out completionPorts);
ThreadPool.SetMaxThreads(threads+10,completionPorts+100);

Timer

  • Lớp Timer hỗ trợ thực thi một phương thức được tham chiếu bởi ủy nhiệm TimerCallback tại một/ nhiều thời điểm xác định một cách không đồng bộ.
  • Phương thức được tham chiếu được thực thi như một tiến trình trong ThreadPool

 

Chia sẽ bài viết :


Bài viết liên quan

Bài 1 Tổng quan về Asp.net

Tìm hiểu môi trường phát triển ứng dụng web với Visual Studio.Net 2010. Tạo và tổ chức một ứng dụng web đơn giản

Bài 2 Server Controls trong Asp.net

Sử dụng thành thạo các điều khiển: HTML Server Controls, Web Server Controls, Specialized Controls.Các sự kiện cơ bản trên trang .aspx. Làm việc với đ ...

Bài 5 Web User Controls trong Asp.net

Khi kết hợp các control để tạo thành một control mới gọi là Web User Controls (UC). Sử dụng UC cũng tương tự như sử dụng thủ tục/hàm => Khả năng tái s ...