bài 10 - threading - nền tảng lập trình ứng dụng với c#

33
TRƯỜNG ĐẠI HC KHOA HC TNHIÊN TP.HCM TRUNG TÂM TIN HC 1

Upload: hoc-lap-trinh-web

Post on 02-Jul-2015

5.073 views

Category:

Documents


1 download

DESCRIPTION

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 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.

TRANSCRIPT

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

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

1

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

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

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

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á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),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ựchiệ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ếntrình.

3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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ìnhD 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.ManagedThreadID);

}• 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.

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

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

}

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

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ôngviệ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ủatiến trình đ ợc hoàn tất

myThreads[i]=new Thread(op);myThreads[i].Start();

}tiến trình được hoàn tấtthông qua sử dụngphương thức

}foreach (Thread t in myThreads){

t.Join();

14

p gThread.Join().

();}

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

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 enum g 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

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

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();}

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

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ới g 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

}

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

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 Evenmore work

Done

Thread abort Aborted

Even

dùng critical region

Start Do work More work Evenmore work

Done

18

Thread abort Aborted

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

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 thitrên nhiều tiến trình riêng biệt, tương tự mô hìnhA h P i M d l (APM)Asynchronous Programming Model (APM).

• .NET framework hỗ trợ APM qua nhiều lớp có cungcấ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

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

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ànhint numBytes = strm EndRead(result);int numBytes = strm.EndRead(result);strm.Close();Console.WriteLine("Read {0}",numBytes);

20

Console.WriteLine(BitConverter.ToString(buffer));

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

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 khinà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

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

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 gcho đến khi phương thức không đống bộ hoàn tất xửlý.

22

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

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ànhint numBytes = strm.EndRead(result);

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

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,buffer.Length,new AsyncCallBack(CompleteRead),str

r.AsyncState;int numBytes=strm.EndRead(r);strm.Close();C l W it Li ( )

24

AsyncCallBack(CompleteRead),strm);

}

Console.WriteLine(…..);}

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

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”);}

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

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

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

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 gnhiều trường hợp mà ta sẽ có thể cần phải tạo tiếntrì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

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

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ìnhstatic 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”);

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

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

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

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

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

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ộttiến trình trong ThreadPool.

31

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

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 độngngay 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.ToLongTimthi khi khởi động Timer.

− Các giá trị có thể thay đổi:• Thời gian chờ đến khi

{ } , geString());

}

TimerCallback tc=newThời gian chờ đến khi khởi động Timer.

• Khoảng thời gian giữa cáclầ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 );

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

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM

TRUNG TÂM TIN HỌC

End

Thanks

33