Tiểu trình, tiến trình , và sự đồng bộ phần 3
Số trang: 10
Loại file: pdf
Dung lượng: 157.90 KB
Lượt xem: 13
Lượt tải: 0
Xem trước 2 trang đầu tiên của tài liệu này:
Thông tin tài liệu:
Bạn có thể sử dụng các lớp dẫn xuất từ WaitHandle (đã được thảo luận trong mục 4.2) để gọi thực thi một phương thức. Bằng phương thức RegisterWaitForSingleObject của lớp ThreadPool, bạn có thể đăng ký thể hiện ủy nhiệm WaitOrTimerCallback với thread-pool khi một đối tượng dẫn xuất từ WaitHandle đi vào trạng thái signaled.
Nội dung trích xuất từ tài liệu:
Tiểu trình, tiến trình , và sự đồng bộ phần 3Bạn có thể sử dụng các lớp dẫn xuất từ WaitHandle (đã được thảo luận trong mục 4.2) đểgọi thực thi một phương thức. Bằng phương thức RegisterWaitForSingleObject của lớpThreadPool, bạn có thể đăng ký thể hiện ủy nhiệm WaitOrTimerCallback với thread-poolkhi một đối tượng dẫn xuất từ WaitHandle đi vào trạng thái signaled. Bạn có thể cấu hìnhthread-pool để thực thi phương thức chỉ một lần hay tự động đăng ký lại phương thứcmỗi khi WaitHandle đi vào trạng thái signaled. Nếu WaitHandle đã ở trạng thái signaledkhi bạn gọi RegisterWaitForSingleObject, phương thức sẽ thực thi ngay lập tức. Phươngthức Unregister của đối tượng System.Threading.RegisteredWaitHandle (được trả về bởiphương thức RegisterWaitForSingleObject) được sử dụng để hủy bỏ việc đăng ký.Lớp thường được dùng làm bộ kích hoạt là AutoResetEvent, nó sẽ tự động chuyển sangtrạng thái unsignaled sau khi ở trạng thái signaled. Tuy nhiên, bạn cũng có thể thay đổitrạng thái signaled theo ý muốn bằng lớp ManualResetEvent hay Mutex. Ví dụ dưới đâytrình bày cách sử dụng một AutoResetEvent để kích hoạt thực thi một phương thức có tênlà EventHandler.using System;using System.Threading;public class EventExecutionExample { // Phương thức sẽ được thực thi khi AutoResetEvent đi vào trạng // thái signaled hoặc quá trình đợi hết thời gian (time-out). private static void EventHandler(object state, bool timedout) { // Hiển thị thông báo thích hợp ra cửa sổ Console // tùy vào quá trình đợi đã hết thời gian hay // AutoResetEvent đã ở trạng thái signaled. if (timedout) { Console.WriteLine({0} : Wait timed out., DateTime.Now.ToString(HH:mm:ss.ffff)); } else { Console.WriteLine({0} : {1}, DateTime.Now.ToString(HH:mm:ss.ffff), state); } } public static void Main() {// Tạo một AutoResetEvent ở trạng thái unsignaled.AutoResetEvent autoEvent = new AutoResetEvent(false);// Tạo một thể hiện ủy nhiệm WaitOrTimerCallback// tham chiếu đến phương thức tĩnh EventHandler.// EventHandler sẽ được gọi khi AutoResetEvent đi vào// trạng thái signaled hay quá trình đợi hết thời gian.WaitOrTimerCallback handler = new WaitOrTimerCallback(EventHandler);// Tạo đối tượng trạng thái (được truyền cho phương thức// thụ lý sự kiện khi nó được kích hoạt). Trong trường hợp// này, một thông báo sẽ được hiển thị.string state = AutoResetEvent signaled.;// Đăng ký thể hiện ủy nhiệm để đợi AutoResetEvent đi vào// trạng thái signaled. Thiết lập giá trị time-out là 3 giây.RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, handler, state, 3000, false);Console.WriteLine(Press ENTER to signal the AutoResetEvent + or enter Cancel to unregister the wait operation.);while (Console.ReadLine().ToUpper() != CANCEL) { // Nếu Cancel không được nhập vào Console, // AutoResetEvent sẽ đi vào trạng thái signal, // và phương thức EventHandler được thực thi. // AutoResetEvent sẽ tự động trở về trạng thái unsignaled. autoEvent.Set();}// Hủy bỏ việc đăng ký quá trình đợi.Console.WriteLine(Unregistering wait operation.);handle.Unregister(null);// Nhấn Enter để kết thúc. Console.WriteLine(Main method complete. Press Enter.); Console.ReadLine(); }} 1.1 Thực thi phương thức bằng tiểu trình mới Bạn muốn thực thi mã lệnh trong một tiểu trình riêng, và muốn kiểm soát hoàn toàn quá trình thực thi và trạng thái của tiểu trình đó. Khai báo một phương thức trả về void và không có đối số. Sau đó, tạo một thể hiện ủy nhiệm System.Threading.ThreadStart tham chiếu đến phương thức này. Tiếp theo, tạo một đối tượng System.Threading.Thread mới, và truyền thể hiện ủy nhiệm cho phương thức khởi dựng của nó. Kế đến, gọi phương thức Thread.Start để bắt đầu thực thi phương thức của bạn.Để tăng độ linh hoạt và mức độ kiểm soát khi hiện thực các ứng dụng hỗ-trợ-đa-tiểu-trình, bạn phải trực tiếp tạo và quản lý các tiểu trình. Đây là cách tiếp cận phức tạp nhấttrong việc lập trình hỗ-trợ-đa-tiểu-trình, nhưng đó cũng là cách duy nhất vượt qua nhữnghạn chế cố hữu trong các cách tiếp cận sử dụng các tiểu trình trong thread-pool, như đãđược thảo luận trong bốn mục trước. Lớp Thread cung cấp một cơ chế mà qua đó bạn cóthể tạo và kiểm soát các tiểu trình. Để tạo và chạy một tiểu trình mới, bạn hãy tiến hànhtheo các bước sau: 1. Tạo một đối tượng ủy nhiệm ThreadStart tham chiếu đến phương thức chứa mã lệnh mà bạn muốn dùng một tiểu trình mới để chạy nó. Giống như các ủy nhiệm khác, ThreadStart có thể tham chiếu đến một phương thức tĩnh hay phương thức của một đối tượng. Phương thức được tham chiếu phải trả về void và không có đối số. 1. Tạo một đối tượng Thread, và truyền thể hiện ủy nhiệm ThreadStart cho phương thức khởi dựng ...
Nội dung trích xuất từ tài liệu:
Tiểu trình, tiến trình , và sự đồng bộ phần 3Bạn có thể sử dụng các lớp dẫn xuất từ WaitHandle (đã được thảo luận trong mục 4.2) đểgọi thực thi một phương thức. Bằng phương thức RegisterWaitForSingleObject của lớpThreadPool, bạn có thể đăng ký thể hiện ủy nhiệm WaitOrTimerCallback với thread-poolkhi một đối tượng dẫn xuất từ WaitHandle đi vào trạng thái signaled. Bạn có thể cấu hìnhthread-pool để thực thi phương thức chỉ một lần hay tự động đăng ký lại phương thứcmỗi khi WaitHandle đi vào trạng thái signaled. Nếu WaitHandle đã ở trạng thái signaledkhi bạn gọi RegisterWaitForSingleObject, phương thức sẽ thực thi ngay lập tức. Phươngthức Unregister của đối tượng System.Threading.RegisteredWaitHandle (được trả về bởiphương thức RegisterWaitForSingleObject) được sử dụng để hủy bỏ việc đăng ký.Lớp thường được dùng làm bộ kích hoạt là AutoResetEvent, nó sẽ tự động chuyển sangtrạng thái unsignaled sau khi ở trạng thái signaled. Tuy nhiên, bạn cũng có thể thay đổitrạng thái signaled theo ý muốn bằng lớp ManualResetEvent hay Mutex. Ví dụ dưới đâytrình bày cách sử dụng một AutoResetEvent để kích hoạt thực thi một phương thức có tênlà EventHandler.using System;using System.Threading;public class EventExecutionExample { // Phương thức sẽ được thực thi khi AutoResetEvent đi vào trạng // thái signaled hoặc quá trình đợi hết thời gian (time-out). private static void EventHandler(object state, bool timedout) { // Hiển thị thông báo thích hợp ra cửa sổ Console // tùy vào quá trình đợi đã hết thời gian hay // AutoResetEvent đã ở trạng thái signaled. if (timedout) { Console.WriteLine({0} : Wait timed out., DateTime.Now.ToString(HH:mm:ss.ffff)); } else { Console.WriteLine({0} : {1}, DateTime.Now.ToString(HH:mm:ss.ffff), state); } } public static void Main() {// Tạo một AutoResetEvent ở trạng thái unsignaled.AutoResetEvent autoEvent = new AutoResetEvent(false);// Tạo một thể hiện ủy nhiệm WaitOrTimerCallback// tham chiếu đến phương thức tĩnh EventHandler.// EventHandler sẽ được gọi khi AutoResetEvent đi vào// trạng thái signaled hay quá trình đợi hết thời gian.WaitOrTimerCallback handler = new WaitOrTimerCallback(EventHandler);// Tạo đối tượng trạng thái (được truyền cho phương thức// thụ lý sự kiện khi nó được kích hoạt). Trong trường hợp// này, một thông báo sẽ được hiển thị.string state = AutoResetEvent signaled.;// Đăng ký thể hiện ủy nhiệm để đợi AutoResetEvent đi vào// trạng thái signaled. Thiết lập giá trị time-out là 3 giây.RegisteredWaitHandle handle = ThreadPool.RegisterWaitForSingleObject(autoEvent, handler, state, 3000, false);Console.WriteLine(Press ENTER to signal the AutoResetEvent + or enter Cancel to unregister the wait operation.);while (Console.ReadLine().ToUpper() != CANCEL) { // Nếu Cancel không được nhập vào Console, // AutoResetEvent sẽ đi vào trạng thái signal, // và phương thức EventHandler được thực thi. // AutoResetEvent sẽ tự động trở về trạng thái unsignaled. autoEvent.Set();}// Hủy bỏ việc đăng ký quá trình đợi.Console.WriteLine(Unregistering wait operation.);handle.Unregister(null);// Nhấn Enter để kết thúc. Console.WriteLine(Main method complete. Press Enter.); Console.ReadLine(); }} 1.1 Thực thi phương thức bằng tiểu trình mới Bạn muốn thực thi mã lệnh trong một tiểu trình riêng, và muốn kiểm soát hoàn toàn quá trình thực thi và trạng thái của tiểu trình đó. Khai báo một phương thức trả về void và không có đối số. Sau đó, tạo một thể hiện ủy nhiệm System.Threading.ThreadStart tham chiếu đến phương thức này. Tiếp theo, tạo một đối tượng System.Threading.Thread mới, và truyền thể hiện ủy nhiệm cho phương thức khởi dựng của nó. Kế đến, gọi phương thức Thread.Start để bắt đầu thực thi phương thức của bạn.Để tăng độ linh hoạt và mức độ kiểm soát khi hiện thực các ứng dụng hỗ-trợ-đa-tiểu-trình, bạn phải trực tiếp tạo và quản lý các tiểu trình. Đây là cách tiếp cận phức tạp nhấttrong việc lập trình hỗ-trợ-đa-tiểu-trình, nhưng đó cũng là cách duy nhất vượt qua nhữnghạn chế cố hữu trong các cách tiếp cận sử dụng các tiểu trình trong thread-pool, như đãđược thảo luận trong bốn mục trước. Lớp Thread cung cấp một cơ chế mà qua đó bạn cóthể tạo và kiểm soát các tiểu trình. Để tạo và chạy một tiểu trình mới, bạn hãy tiến hànhtheo các bước sau: 1. Tạo một đối tượng ủy nhiệm ThreadStart tham chiếu đến phương thức chứa mã lệnh mà bạn muốn dùng một tiểu trình mới để chạy nó. Giống như các ủy nhiệm khác, ThreadStart có thể tham chiếu đến một phương thức tĩnh hay phương thức của một đối tượng. Phương thức được tham chiếu phải trả về void và không có đối số. 1. Tạo một đối tượng Thread, và truyền thể hiện ủy nhiệm ThreadStart cho phương thức khởi dựng ...
Tìm kiếm theo từ khóa liên quan:
công nghệ thông tin kĩ thuật lập trình ngôn ngữ lập trình ngôn ngữ C# C# Tiểu trình tiến trình và sự đồng bộ phần 3Gợi ý tài liệu liên quan:
-
52 trang 429 1 0
-
Top 10 mẹo 'đơn giản nhưng hữu ích' trong nhiếp ảnh
11 trang 311 0 0 -
74 trang 294 0 0
-
96 trang 290 0 0
-
Báo cáo thực tập thực tế: Nghiên cứu và xây dựng website bằng Wordpress
24 trang 288 0 0 -
Đồ án tốt nghiệp: Xây dựng ứng dụng di động android quản lý khách hàng cắt tóc
81 trang 278 0 0 -
EBay - Internet và câu chuyện thần kỳ: Phần 1
143 trang 272 0 0 -
Giáo trình Lập trình hướng đối tượng: Phần 2
154 trang 271 0 0 -
Tài liệu dạy học môn Tin học trong chương trình đào tạo trình độ cao đẳng
348 trang 269 1 0 -
Bài thuyết trình Ngôn ngữ lập trình: Hệ điều hành Window Mobile
30 trang 262 0 0