• Threading là một khái niệm quan trọng trong pháttriển phần mềm, hỗ trợ thực hiện nhiều tác vụ tại ù ột thời đ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
Trang 2• Khai báo và khởi tạo tiến trình
• Lậ t ì h khô đồ bộ
• Lập trình không đồng bộ
Trang 3• 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
ù ột thời đ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.
Trang 4• 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
Trang 6• Các thuộc tính và phương thức của tiến trình
− Các thuộc tính tĩnh (static properties)
• CurrentContext
• CurrentPrincipal p
• CurrentThread
Trang 7• Các thuộc tính và phương thức của tiến trình
Trang 8• Các thuộc tính và phương thức của tiến trình
• Các thuộc tính và phương thức của tiến trình
− Các phương thức tĩnh (static methods)
Trang 9• Các thao tác trên tiến trình
− Khởi tạo tiến trình
− Thực thi tiến trình
− Ghép nối các tiến trình
− Ghép nối các tiến trình
− Tạm dừng và hủy bỏ vĩnh viễn
Trang 10• Khởi tạo tiến trình
− Trong NET Framework namespaceTrong 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
Trang 11• Thực thi tiến trình
− Tiến trình được khởi tạo sẽ không tự động thực thiTiế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
Trang 12”,Thread.CurrentThread.Manag edThreadID);
Thread myThread=new Thread( op );
myThread Start ();
Start để thực thi tiến trình mới.
Trang 13− Đ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
cùng 1 thời điểm
− Ta có thể sửa lại đoạn code trên để hỗ trợ xử lý đa tiến
trình như sau:
ThreadStart op =new TharedStart();
for (int i=0;i<5;i++){
Thread myThread=new Thread( op );
myThread Start ();
}
}
Trang 14• Ghép nối các tiến trình
• 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ý
ThreadStart op =new
ThreadStart( SimpleWork );
Thread[] myThreads=new Thread[5];
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 for (int i=0;i<5;i++){
chính (main thread) chờ cho đến khi xử lý của tiến trình đ ợc hoàn tất
myThreads[i]=new Thread( op ); myThreads[i] Start ();
Trang 17SomeClass.WriteToConsole();
}
Trang 18Start Do work More work Even
more work Done
Even
dùng critical region
Start Do work More work Even
more work Done
Trang 19• 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.
Trang 20• Ví d
• Ví dụ:
byte[] buffer = new byte[100];
FileStream strm = new FileStream(“c:/aaa.txt”, FileMode.Open, ( , p ,
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); y g ( , , g , , );
// 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);
strm.Close();
Console.WriteLine("Read {0}",numBytes);
Console.WriteLine(BitConverter.ToString(buffer));
Trang 21• 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ộ
W it U til D
− Wait-Until-Done
− Pooling
− Callback
Trang 23− 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ộ
// xử lý khác khi chưa kết thúc lời gọi phương thức không đồng bộ
Trang 24• C llb k M d l
• Callback Model
− 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ộ
static void TestCallbackAPM(){ static void CompleteRead(IAsyncResult r){
string filename=“…”;
FileStream strm=new ….;
// thực hiện lời gọi không đồng bộ
Console.WriteLine(“Read Completed”);
Trang 25− Khi dùng APM, các tác vụ có thể phát sinh các ngoại
Trang 26• ThreadPool
• Timer
• Timer
Trang 27• ThreadPool thực thi nhanh
• Điều khiển số luồng thực thi tại cùng 1 thời điểm Điều khiển số luồng thực thi tại cùng 1 thời điểm
Trang 28• Sử dụng ThreadPool
− Dùng phương thức QueueUserWorkItem của ThreadPool
để tạo và điều khiển các tiến trình
static void WorkWithParameter(object o){
for (int i=0;i<10;i++){
WaitCallback workItem=new WaitCallback( WorkWithParameter );
if (ThreadPool QueueUserWorkItem (workItem ”ThreadPooled”);
if (ThreadPool QueueUserWorkItem (workItem,”ThreadPooled”);
Console.WriteLine(“Could not queue item”);
Trang 29• 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:g p y g
• Starvation
• Startup thread speed
− Thay đổi chỉ ảnh hưởng đến tiến trình hiện hành
Trang 30• 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 ợ g g ạ
int threads;
int completionPorts;
ThreadPool.GetMaxThreads(out threads,out completionPorts);
ThreadPool SetMaxThreads (threads+10,completionPorts+100);
Trang 31• Timer
− Lớp Timer hỗ trợ thực thi một phương thức được thamchiế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ộttiến trình trong ThreadPool
Trang 32T Ti khởi độ h thứ
• Sử dụng Timer
− Khai báo Timer chỉ định
Tạo Timer khởi động phương thức
TimerTick mỗi giây, khởi động ngay lập tức :
Khai báo Timer, chỉ định một phương thức cho ủy nhiệm TimerCallback thực thi khi khởi động Timer
static void TimerTick(object o){
Console.WriteLine(“Tick : {0}”,DateTime.Now.ToLongTim
thi khi khởi động Timer
− Các giá trị có thể thay đổi:
• Thời gian chờ đến khi
eString());
} TimerCallback tc=new
Thời gian chờ đến khi khởi động Timer.
• Khoảng thời gian giữa các lần khởi động
Trang 33Thanks