TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
1
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Bài 10: Threading
• 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ộ
2
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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
ù ộ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ựcvớ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.
3
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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
4
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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 thuộc tính và phương thức của tiến trình
− Các thuộc tính
• IsAlive• IsAlive
• IsBackground
• IsThreadPoolThread
• ManagedThread
• Name
• Priority
• ThreadState
5
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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 thuộc tính tĩnh (static properties)Các thuộc tính tĩnh (static properties)
• CurrentContext
• CurrentPrincipalp
• CurrentThread
6
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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 phương thứcCác phương thức
• Abort
• Interrupp
• Join
• Resume
• Start
• Suspend
7
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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 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)
• BeginCriticalRegion• BeginCriticalRegion
• EndCriticalRegion
• GetDomainGet o a
• GetDomainID
• ResetAbort
• Sleep
• SpinWait
• V l til R d
8
• VolatileRead
• VolatileWrite
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Các thao tác trên tiến trình
− Khởi tạo tiến trìnhKhở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
9
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• 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ề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
10
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• 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
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
D khởi à• Demo khởi tạo và
thực thi tiến trình:
• T ột h
Static void SimpleWork(){
Console.WriteLine(“Thread: {0}
• Tạo một phương
thức không tham số,
không trả về dữ liệu.
”,Thread.CurrentThread.Manag
edThreadID);
}
• Tạo ủy nhiệm
ThreadStart
• T Th d ới
ThreadStart op=new
ThreadStart(SimpleWork);
Th d Th d Th d( )• Tạo Thread mới
• Gọi phương thức
Start để thực thi tiến
Thread myThread=new Thread(op);
myThread.Start();
12
Start để thực thi tiến
trình mới.
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo 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ểmcù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();
}
13
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• 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();
}tiến trình được hoàn tất
thông qua sử dụng
phương thức
}
foreach (Thread t in myThreads){
t.Join();
14
p g
Thread.Join().
();
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Threading priority
− Hỗ trợ gán/ lấy độ ưu tiên của tiến trình thông qua enumg y g q
ThreadingPriority.
− Các giá trị của ThreadingPriority
• HighestHighest
• AboveNormal
• Normal
• BelowNormal
• Lowest
− Thường sử dụng giá trị default là Normal
15
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
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Tạm dừng và loại bỏ vĩnh viễnTạ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 myThread=new Thread(new ThreadStart(AbortThisThread));
myHtread.Start();
myThread.Abort();
static void AbortThisThread(){
Có an
toàn
không ?static void AbortThisThread(){
SomeClass.IsValid=true;
SomeClase.IsComplete=true;
không ?
16
SomeClass.WriteToConsole();
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• 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 critical region vớig p g
BeginCriticalRegion và EndReticalRegion.
static void AbortThisThread(){
Thread.BeginCriticalRegion();
SomeClass.IsValid=true;
SomeClase.IsComplete=true;
Critical
Region
SomeClase.IsComplete true;
Thread.EndCriticalRegion();
SomeClass.WriteToConsole();
17
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• T dừ à l i bỏ ĩ h iễ
Không dùng
• 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 critical region
E
Không dùng
critical
region
Start Do work More work
Even
more work
Done
Thread abort Aborted
Even
dùng critical
region
Start Do work More work
Even
more work
Done
18
Thread abort Aborted
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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
A h P i M d l (APM)Asynchronous Programming Model (APM).
• .NET framework hỗ trợ APM qua nhiều lớp có cung
cấp phương thức BeginXXX và EndXXXcấ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.
19
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• 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);int numBytes = strm.EndRead(result);
strm.Close();
Console.WriteLine("Read {0}",numBytes);
20
Console.WriteLine(BitConverter.ToString(buffer));
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• 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
− CallbackCallback
21
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Wait-Until-Done Model:
− Cho phép bắt đầu lời gọi phương thức không đồng bộ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
ế ố ấ
g p g g g
cho đến khi phương thức không đống bộ hoàn tất xử
lý.
22
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• P lli M d l• Polling Model
− Tương tự Wait-Until-Done, nhưng có thăm dò
IAsyncResult để biết xử lý đã hoàn tất chưaIAsyncResult để 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ộ
Thread.Sleep(100);
}
// E dR d ẽ bị khó h đế khi ử lý khô đồ bộ h à thà h
23
// EndRead sẽ bị khóa cho đến khi xử lý không đồng bộ hoàn thành
int numBytes = strm.EndRead(result);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• 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 để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”);
FileStream strm=(FileStream)
r AsyncState;
IAsyncResult
result=strm.BeginRead(buffer,0,buf
fer.Length,new
AsyncCallBack(CompleteRead),str
r.AsyncState;
int numBytes=strm.EndRead(r);
strm.Close();
C l W it Li ( )
24
AsyncCallBack(CompleteRead),str
m);
}
Console.WriteLine(…..);
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Ngoại lệ và APM• Ngoạ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ý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);numBytes=strm.EndRead(result);
}
Catch (IOException){
25
Console.WriteLine(“An IO Exception occurred”);
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• ThreadPool
• Timer• Timer
26
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
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 thiTrong 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
ề ể ầ ế
p g g
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− 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
27
Điều khiển số luồng thực thi tại cùng 1 thời điểm
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Sử dụng ThreadPoolSử 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++){
Console.WriteLine(“{0}:Console.WriteLine( {0}:
{1}”,o.ToString(),Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
}}
}
WaitCallback workItem=new WaitCallback(WorkWithParameter);
if (ThreadPool QueueUserWorkItem(workItem ”ThreadPooled”);
28
if (ThreadPool.QueueUserWorkItem(workItem,”ThreadPooled”);
Console.WriteLine(“Could not queue item”);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• 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ốiThreadPool 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
29
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• 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;int completionPorts;
ThreadPool.GetMaxThreads(out threads,out completionPorts);
ThreadPool.SetMaxThreads(threads+10,completionPorts+100);
30
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Timer
− Lớp Timer hỗ trợ thực thi một phương thức được thamLớ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.
31
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
T 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
{ } , g
eString());
}
TimerCallback tc=newThời gian chờ đến khi
khởi động Timer.
• Khoảng thời gian giữa các
lần khởi động
TimerCallback tc=new
TimerCallback(TimerTick);
Timer tm=new Timer(tc ,nothing ,
0 1000 )
32
lần khởi động. 0 ,1000 );
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
End
Thanks
33

Bài 10 - Threading - Nền tảng lập trình ứng dụng với C#

  • 1.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 1
  • 2.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Bài 10: Threading • 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ộ 2
  • 3.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 ù ộ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ựcvớ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. 3
  • 4.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 4
  • 5.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 thuộc tính và phương thức của tiến trình − Các thuộc tính • IsAlive• IsAlive • IsBackground • IsThreadPoolThread • ManagedThread • Name • Priority • ThreadState 5
  • 6.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 thuộc tính tĩnh (static properties)Các thuộc tính tĩnh (static properties) • CurrentContext • CurrentPrincipalp • CurrentThread 6
  • 7.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 phương thứcCác phương thức • Abort • Interrupp • Join • Resume • Start • Suspend 7
  • 8.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 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) • BeginCriticalRegion• BeginCriticalRegion • EndCriticalRegion • GetDomainGet o a • GetDomainID • ResetAbort • Sleep • SpinWait • V l til R d 8 • VolatileRead • VolatileWrite
  • 9.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • Các thao tác trên tiến trình − Khởi tạo tiến trìnhKhở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 9
  • 10.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • 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ề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 10
  • 11.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • 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 11
  • 12.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình D khởi à• Demo khởi tạo và thực thi tiến trình: • T ột h Static void SimpleWork(){ Console.WriteLine(“Thread: {0} • Tạo một phương thức không tham số, không trả về dữ liệu. ”,Thread.CurrentThread.Manag edThreadID); } • Tạo ủy nhiệm ThreadStart • T Th d ới ThreadStart op=new ThreadStart(SimpleWork); Th d Th d Th d( )• Tạo Thread mới • Gọi phương thức Start để thực thi tiến Thread myThread=new Thread(op); myThread.Start(); 12 Start để thực thi tiến trình mới.
  • 13.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo 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ểmcù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(); } 13 }
  • 14.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • 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(); }tiến trình được hoàn tất thông qua sử dụng phương thức } foreach (Thread t in myThreads){ t.Join(); 14 p g Thread.Join(). (); }
  • 15.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • Threading priority − Hỗ trợ gán/ lấy độ ưu tiên của tiến trình thông qua enumg y g q ThreadingPriority. − Các giá trị của ThreadingPriority • HighestHighest • AboveNormal • Normal • BelowNormal • Lowest − Thường sử dụng giá trị default là Normal 15 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
  • 16.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • Tạm dừng và loại bỏ vĩnh viễnTạ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 myThread=new Thread(new ThreadStart(AbortThisThread)); myHtread.Start(); myThread.Abort(); static void AbortThisThread(){ Có an toàn không ?static void AbortThisThread(){ SomeClass.IsValid=true; SomeClase.IsComplete=true; không ? 16 SomeClass.WriteToConsole(); }
  • 17.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • 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 critical region vớig p g BeginCriticalRegion và EndReticalRegion. static void AbortThisThread(){ Thread.BeginCriticalRegion(); SomeClass.IsValid=true; SomeClase.IsComplete=true; Critical Region SomeClase.IsComplete true; Thread.EndCriticalRegion(); SomeClass.WriteToConsole(); 17 }
  • 18.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Khai báo và khởi tạo tiến trình • T dừ à l i bỏ ĩ h iễ Không dùng • 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 critical region E Không dùng critical region Start Do work More work Even more work Done Thread abort Aborted Even dùng critical region Start Do work More work Even more work Done 18 Thread abort Aborted
  • 19.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 A h P i M d l (APM)Asynchronous Programming Model (APM). • .NET framework hỗ trợ APM qua nhiều lớp có cung cấp phương thức BeginXXX và EndXXXcấ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. 19
  • 20.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • 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);int numBytes = strm.EndRead(result); strm.Close(); Console.WriteLine("Read {0}",numBytes); 20 Console.WriteLine(BitConverter.ToString(buffer));
  • 21.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • 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 − CallbackCallback 21
  • 22.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • Wait-Until-Done Model: − Cho phép bắt đầu lời gọi phương thức không đồng bộ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 ế ố ấ g p g g g cho đến khi phương thức không đống bộ hoàn tất xử lý. 22
  • 23.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • P lli M d l• Polling Model − Tương tự Wait-Until-Done, nhưng có thăm dò IAsyncResult để biết xử lý đã hoàn tất chưaIAsyncResult để 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ộ Thread.Sleep(100); } // E dR d ẽ bị khó h đế khi ử lý khô đồ bộ h à thà h 23 // EndRead sẽ bị khóa cho đến khi xử lý không đồng bộ hoàn thành int numBytes = strm.EndRead(result);
  • 24.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • 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 để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”); FileStream strm=(FileStream) r AsyncState; IAsyncResult result=strm.BeginRead(buffer,0,buf fer.Length,new AsyncCallBack(CompleteRead),str r.AsyncState; int numBytes=strm.EndRead(r); strm.Close(); C l W it Li ( ) 24 AsyncCallBack(CompleteRead),str m); } Console.WriteLine(…..); }
  • 25.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • Ngoại lệ và APM• Ngoạ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ý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);numBytes=strm.EndRead(result); } Catch (IOException){ 25 Console.WriteLine(“An IO Exception occurred”); }
  • 26.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • ThreadPool • Timer• Timer 26
  • 27.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC 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 thiTrong 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 ề ể ầ ế p g g 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− 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 27 Điều khiển số luồng thực thi tại cùng 1 thời điểm
  • 28.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • Sử dụng ThreadPoolSử 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++){ Console.WriteLine(“{0}:Console.WriteLine( {0}: {1}”,o.ToString(),Thread.CurrentThread.ManagedThreadId); Thread.Sleep(10); }} } WaitCallback workItem=new WaitCallback(WorkWithParameter); if (ThreadPool QueueUserWorkItem(workItem ”ThreadPooled”); 28 if (ThreadPool.QueueUserWorkItem(workItem,”ThreadPooled”); Console.WriteLine(“Could not queue item”);
  • 29.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • 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ốiThreadPool 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 29
  • 30.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • 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;int completionPorts; ThreadPool.GetMaxThreads(out threads,out completionPorts); ThreadPool.SetMaxThreads(threads+10,completionPorts+100); 30
  • 31.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ • Timer − Lớp Timer hỗ trợ thực thi một phương thức được thamLớ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. 31
  • 32.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC Lập trình không đồng bộ T 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 { } , g eString()); } TimerCallback tc=newThời gian chờ đến khi khởi động Timer. • Khoảng thời gian giữa các lần khởi động TimerCallback tc=new TimerCallback(TimerTick); Timer tm=new Timer(tc ,nothing , 0 1000 ) 32 lần khởi động. 0 ,1000 );
  • 33.
    TRƯỜNG ĐẠI HỌCKHOA HỌC TỰ NHIÊN TP.HCM TRUNG TÂM TIN HỌC End Thanks 33