111 Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu • Đặc tính có được thừa kế bởi các kiểu dẫn xuất hay không l!2.MIs9I$4&g>)Kh NOM%|>)K'5.(.&'S$&>)i8X M%'F49MIIG=g;(..^Z_hP M%8!&CLR8O)4';i:M 9BNOM% l * . ! 2 e' &I % S' )3 ; . Q M C Q $ System.Attribute P ! 2 e' &I public F > I G &5 + Attribute -"!2e'&IF2.M:C)=4P ¯Ç•‘ÀÇ‘M:C)=@C¯Ç•‘ÀÇ‘i2gpositional parameterh! 2H&…8&*F&M:C)=8 X )ee'0O)6DÀÇ‘i2)! 2L…2 0,4)!2&CD ÀÇ‘$>>gnamed parameterh l : )e ) ! 28 ¥Î¤ ‘ ) ! 2 AttributeUsageAttribute !2e'&I&*l!2 AttributeUsageAttribute #$.DÀÇ‘i2DÀÇ‘$>>8$.4&^^Pi.! iJii@$)!2e'&I&*I&*4) AttributeUsageAttribute !4Jii.4D Bảng 3.3 Các thành viên thuộc kiểu liệt kê AttributeUsage Thông số Kiểu Mô tả Mặc định ValidOn i2 " > > System.AttributeTargets 8 J i NOM%.!2@ F=>F AttributeTargets.All AllowMultiple $> > l!2F$Ji N.NO'4 false Inherited $> > l!2F$QI&C )3 ; ' > $ X1'4 true u2))<'%&'*.!2e'&IF> AuthorAttribute 8X &*;i>4' *'(.&' AuthorAttribute &. M:C)=486.#:>l''>N O) AuthorAttribute 4.DÀÇ‘i2:> Company 24gF)e.DÀÇ‘$>>h8 Name 2Jz0g4 )e.DÀÇ‘$>>h using System; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] public class AuthorAttribute : System.Attribute { 112 Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu private string company; // Công ty của tác giả private string name; // Tên tác giả // Khai báo phương thức khởi dựng công khai. public AuthorAttribute(string name) { this.name = name; company = ""; } // Khai báo thuộc tính Company có quyền set/get. public string Company { get { return company; } set { company = value; } } // Khai báo thuộc tính Name chỉ-đọc. public string Name{ get { return name;} } } U<'O) AuthorAttribute \ // Khai báo Square Nguyen là tác giả của assembly. [assembly:Author("Square Nguyen", Company = "Goldsoft Ltd.")] // Khai báo Square Nguyen là tác giả của lớp. [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class SomeClass { § } // Khai báo Stephen Chow là tác giả của lớp. [Author("Stephen Chow")] public class SomeOtherClass { § 113 Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu } 14. 14. S d ng c ch ph n chi u đ ki m traử ụ ơ ế ả ế ể ể S d ng c ch ph n chi u đ ki m traử ụ ơ ế ả ế ể ể các đ c tính c a m t ph n t ch ng trìnhặ ủ ộ ầ ử ươ các đ c tính c a m t ph n t ch ng trìnhặ ủ ộ ầ ử ươ Bạn muốn sử dụng cơ chế phản chiếu để kiểm tra các đặc tính tùy biến đã được áp dụng cho một phần tử chương trình. Gọi phương thức GetCustomAttributes của đối tượng dẫn xuất từ lớp System.Reflection.MemberInfo (đối tượng này mô tả phần tử chương trình cần kiểm tra). 7.4NOM%)3;Q MemberInfo y'& t. Type 8 EventInfo 8 FieldInfo 8 PropertyInfo 8 MethodBase MethodBase F>. \ ConstructorInfo MethodInfo L*F0M: GetCustomAttributes I F$&%D$'RM:'@.:! 2e'&IS$)NOM%PGB.'J:! 2e'&I:4:!2FÏMCNET Framework RM: GetCustomAttributes F)*:U*N>6.DD bool ;iM:'F!2$QIQ'4U* :6>..DD Type Fk.&08I9!2 S$Ji&C Type u2)O)!2e'&I AuthorAttribute S$&.^Z^ ) F GetCustomAttributesExample RM : Main @ 0 M : GetCustomAttributes 8 0 ! 2 I 9 J F AuthorAttribute L*F=X!2'.I AuthorAttribute ';>G.4NO)MI I using System; [Author("Stephen Chau")] [Author("Square Nguyen", Company = "Goldsoft Ltd.")] public class GetCustomAttributesExample { public static void Main() { // Lấy đối tượng Type cho chính lớp này. Type type = typeof(GetCustomAttributesExample); // Lấy các đặc tính cho kiểu này. Sử dụng bộ lọc để // kết quả trả về chỉ có các thể hiện của AuthorAttribute. 114 Chương 3: Miền ứng dụng, cơ chế phản chiếu, và siêu dữ liệu object[] attrs = type.GetCustomAttributes(typeof(AuthorAttribute), true); // Liệt kê các đặc tính. foreach (AuthorAttribute a in attrs) { Console.WriteLine(a.Name + ", " + a.Company); } // Nhấn Enter để kết thúc. Console.ReadLine(); } } 4 115 Chương 4:TIỂU TRÌNH, TIẾN TRÌNH, VÀ SỰ ĐỒNG BỘ 116 117 Chương 4: Tiểu trình, tiến trình, và sự đồng bộ K..* Microsoft Windows X M%gI%Eprocessh*'t X.#I %=t g&5%EthreadhPM '@%&'.I%%:))= 2v).NET Framework P.M'@%&' =\ " |O)€62v.NET Framework* %.g._ZI_`h w.9%=.%&I$FIGg. _a_[h lt&F9%=%g._b_ch P*')QI%.g._Zd_ZZh L.5*. .JF*'.:)g._Z]h 1. 1. Th c thi ph ng th c v i thread-poolự ươ ứ ớ Th c thi ph ng th c v i thread-poolự ươ ứ ớ Bạn cần thực thi một phương thức bằng một tiểu trình trong thread-pool của bộ thực thi. Khai báo một phương thức chứa mã lệnh cần thực thi; phương thức này phải trả về void và chỉ nhận một đối số. Sau đó, tạo một thể hiện của ủy nhiệm System.Threading.WaitCallback tham chiếu đến phương thức này. Tiếp tục, gọi phương thức tĩnh QueueUserWorkItem của lớp System.Threading.ThreadPool , và truyền thể hiện ủy nhiệm đã tạo làm đối số. Bộ thực thi sẽ xếp thể hiện ủy nhiệm này vào hàng đợi và thực thi nó khi một tiểu trình trong thread-pool sẵn sàng. HI:)O)%F D/')'%.D$ %t %vF.G&C2*86 '%H8.D#z$zzz%8% C *#D. ) =e$uO) ()z@.5.29'.4v D#z$zzz% .NET Framework.=M()z.GF' ;49>q ThreadPool RM: QueueUserWorkItem X&*=.M:&5.%()z g!4 $h"#4$.4&C.'. WaitCallback g. IIM:N=hw.%()zÏ8F6 4IIQ$=4'wS48'%I G8%'9'()z64IIQ$ uO)()z&=GMF6%#z$zzz% 7'>8NB<'()z$=M8J5..2O) 79'IiO)()z'8N;(.;X.\ 118 Chương 4: Tiểu trình, tiến trình, và sự đồng bộ • L=9'iD%D$()zT&*4' sDD'&5.D%'Q&>.S$z9zBp *.!i]`%.#CPUD|D%D ()z4*D4 $ • P?X&*O)()z =.S.= I8&=kO)()z.2&>8&t. =M:.&t&g;(.._]h==i g;(.._^h74'F)3I=K %()zTq$FC>)"!)e)D $J&i*&CD$&k*I%&=8 $9)@.X)9%=4 $ • L*4>O)()z=I%*'. )u%D%()zF*8>J.D2% I%*'?@CI&v()z l!&8&*>!%()z*$ . 9) • L*4i%%()z8? 4's>47()z;OB4( :=&*>.G$ • "4S$!$%&*4'')QF u2))<'%&'O) ThreadPool =.M:F> DisplayMessage u2)'@' DisplayMessage I()zN8NN4 FDD8NFDDD$ MessageInfo gX.4. %@ih using System; using System.Threading; // Lớp dùng để truyền dữ liệu cho phương thức DisplayMessage // khi nó được thực thi bằng thread-pool. public class MessageInfo { private int iterations; private string message; // Phương thức khởi dựng nhận các thiết lập cấu hình cho tiểu trình. public MessageInfo(int iterations, string message) { this.iterations = iterations; 119 Chương 4: Tiểu trình, tiến trình, và sự đồng bộ this.message = message; } // Các thuộc tính dùng để lấy các thiết lập cấu hình. public int Iterations { get { return iterations; } } public string Message { get { return message; } } } public class ThreadPoolExample { // Hiển thị thông tin ra cửa sổ Console. public static void DisplayMessage(object state) { // Ép đối số state sang MessageInfo. MessageInfo config = state as MessageInfo; // Nếu đối số config là null, không có đối số nào được // truyền cho phương thức ThreadPool.QueueUserWorkItem; // sử dụng các giá trị mặc định. if (config == null) { // Hiển thị một thông báo ra cửa sổ Console ba lần. for (int count = 0; count < 3; count++) { Console.WriteLine("A thread-pool example."); // Vào trạng thái chờ, dùng cho mục đích minh họa. // Tránh đưa các tiểu trình của thread-pool // vào trạng thái chờ trong các ứng dụng thực tế. Thread.Sleep(1000); } } else { // Hiển thị một thông báo được chỉ định trước // với số lần cũng được chỉ định trước. for (int count = 0; count < config.Iterations; count++) { 120 Chương 4: Tiểu trình, tiến trình, và sự đồng bộ Console.WriteLine(config.Message); // Vào trạng thái chờ, dùng cho mục đích minh họa. // Tránh đưa các tiểu trình của thread-pool // vào trạng thái chờ trong các ứng dụng thực tế. Thread.Sleep(1000); } } } public static void Main() { // Tạo một đối tượng ủy nhiệm, cho phép chúng ta // truyền phương thức DisplayMessage cho thread-pool. WaitCallback workMethod = new WaitCallback(ThreadPoolExample.DisplayMessage); // Thực thi DisplayMessage bằng thread-pool (không có đối số). ThreadPool.QueueUserWorkItem(workMethod); // Thực thi DisplayMessage bằng thread-pool (truyền một // đối tượng MessageInfo cho phương thức DisplayMessage). MessageInfo info = new MessageInfo(5, "A thread-pool example with arguments."); ThreadPool.QueueUserWorkItem(workMethod, info); // Nhấn Enter để kết thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } . traử ụ ơ ế ả ế ể ể các đ c tính c a m t ph n t ch ng trình ủ ộ ầ ử ươ các đ c tính c a m t ph n t ch ng trình ủ ộ ầ ử ươ Bạn muốn sử dụng cơ chế phản chiếu để kiểm tra các đặc tính tùy biến. thức khởi dựng nhận các thiết lập cấu hình cho tiểu trình. public MessageInfo(int iterations, string message) { this.iterations = iterations; 119 Chương 4: Tiểu trình, tiến trình, và sự đồng. count++) { 120 Chương 4: Tiểu trình, tiến trình, và sự đồng bộ Console.WriteLine(config.Message); // Vào trạng thái chờ, dùng cho mục đích minh họa. // Tránh đưa các tiểu trình của thread-pool //