YOMEDIA
ADSENSE
Các giải pháp lập trình C Sharp_3
42
lượt xem 7
download
lượt xem 7
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Tham khảo tài liệu 'các giải pháp lập trình c sharp_3', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Các giải pháp lập trình C Sharp_3
- 106 Chương 4: Ti u trình, ti n trình, và s ng b public static void PollingExample() { Console.WriteLine(Environment.NewLine + "*** Running Polling Example ***"); // G i LongRunningMethod m t cách b t ng b . Truy n null cho // c y nhi m callback và i tư ng tr ng thái b t ng b . AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Polling", null, null); // Th c hi n polling ki m tra phương th c th c thi // b t ng b k t thúc hay chưa. N u chưa k t thúc // thì i vào tr ng thái ch trong 300 mini-giây // trư c khi th c hi n polling l n n a. Console.WriteLine("{0} : Poll repeatedly until method is " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!asyncResult.IsCompleted) { Console.WriteLine("{0} : Polling...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(300); } // Thu l y k t qu c a phương th c th c thi b t ng b . DateTime completion = longRunningMethod.EndInvoke(asyncResult); // Hi n th thông tin k t thúc. Console.WriteLine("{0} : Polling example complete.", completion.ToString("HH:mm:ss.ffff")); } 3. Phương th c WaitingExample Phương th c WaitingExample th c thi b t ng b phương th c LongRunningExample và sau ó ch cho n khi LongRunningMethod k t thúc. WaitingExample s d ng thu c tính AsyncWaitHandle c a th hi n IAsyncResult ( ư c tr v b i BeginInvoke) có ư c m t WaitHandle và sau ó g i phương th c WaitOne c a WaitHandle. Vi c s d ng giá tr time-out cho phép WaitingExample d ng quá trình i th c hi n công vi c khác ho c d ng hoàn toàn n u phương th c th c thi b t ng b di n ra quá lâu. public static void WaitingExample() { Console.WriteLine(Environment.NewLine + "*** Running Waiting Example ***"); // G i LongRunningMethod m t cách b t ng b . Truy n null cho // c y nhi m callback và i tư ng tr ng thái b t ng b . AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Waiting", null, null); // i phương th c th c thi b t ng b k t thúc. // Time-out sau 300 mili-giây và hi n th tr ng thái ra // c a s Console trư c khi ti p t c i.
- 107 Chương 4: Ti u trình, ti n trình, và s ng b Console.WriteLine("{0} : Waiting until method is complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!asyncResult.AsyncWaitHandle.WaitOne(300, false)) { Console.WriteLine("{0} : Wait timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Thu l y k t qu c a phương th c th c thi b t ng b . DateTime completion = longRunningMethod.EndInvoke(asyncResult); // Hi n th thông tin k t thúc. Console.WriteLine("{0} : Waiting example complete.", completion.ToString("HH:mm:ss.ffff")); } 4. Phương th c WaitAllExample Phương th c WaitAllExample th c thi b t ng b phương th c LongRunningMethod nhi u l n và sau ó s d ng m ng các i tư ng WaitHandle i cho n khi t t c các phương th c k t thúc. public static void WaitAllExample() { Console.WriteLine(Environment.NewLine + "*** Running WaitAll Example ***"); // M t ArrayList ch a các th hi n IAsyncResult // cho các phương th c th c thi b t ng b . ArrayList asyncResults = new ArrayList(3); // G i ba l n LongRunningMethod m t cách b t ng b . // Truy n null cho c y nhi m callback và i tư ng // tr ng thái b t ng b . Thêm th hi n IAsyncResult // cho m i phương th c vào ArrayList. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); asyncResults.Add(longRunningMethod.BeginInvoke(3000, "WaitAll 1", null, null)); asyncResults.Add(longRunningMethod.BeginInvoke(2500, "WaitAll 2", null, null)); asyncResults.Add(longRunningMethod.BeginInvoke(1500, "WaitAll 3", null, null)); // T o m t m ng các i tư ng WaitHandle, // s ư c s d ng i t t c các phương th c // th c thi b t ng b k t thúc. WaitHandle[] waitHandles = new WaitHandle[3]; for (int count = 0; count < 3; count++) { waitHandles[count] = ((IAsyncResult)asyncResults[count]).AsyncWaitHandle; } // i c ba phương th c th c thi b t ng b k t thúc. // Time-out sau 300 mili-giây và hi n th tr ng thái ra // c a s Console trư c khi ti p t c i.
- 108 Chương 4: Ti u trình, ti n trình, và s ng b Console.WriteLine("{0} : Waiting until all 3 methods are " + "complete...", DateTime.Now.ToString("HH:mm:ss.ffff")); while(!WaitHandle.WaitAll(waitHandles, 300, false)) { Console.WriteLine("{0} : WaitAll timeout...", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Ki m tra k t qu c a m i phương th c và xác nh // th i gian phương th c cu i cùng k t thúc. DateTime completion = DateTime.MinValue; foreach (IAsyncResult result in asyncResults) { DateTime time = longRunningMethod.EndInvoke(result); if ( time > completion) completion = time; } // Hi n th thông tin k t thúc. Console.WriteLine("{0} : WaitAll example complete.", completion.ToString("HH:mm:ss.ffff")); } 5. Phương th c CallbackExample Phương th c CallbackExample th c thi b t ng b phương th c LongRunningMethod và truy n m t th hi n y nhi m AsyncCallback (tham chi u n phương th c CallbackHandler) cho phương th c BeginInvoke. Phương th c CallbackHandler s ư c g i m t cách t ng khi phương th c LongRunningMethod k t thúc, k t qu là phương th c CallbackExample v n ti p t c th c hi n công vi c. public static void CallbackExample() { Console.WriteLine(Environment.NewLine + "*** Running Callback Example ***"); // G i LongRunningMethod m t cách b t ng b . Truy n m t // th hi n y nhi m AsyncCallback tham chi u n // phương th c CallbackHandler. CallbackHandler s // t ng ư c g i khi phương th c th c thi b t ng b // k t thúc. Truy n m t tham chi u n th hi n y nhi m // AsyncExampleDelegate như m t tr ng thái b t ng b ; // n u không, phương th c callback không th truy xu t // th hi n y nhi m g i EndInvoke. AsyncExampleDelegate longRunningMethod = new AsyncExampleDelegate(LongRunningMethod); IAsyncResult asyncResult = longRunningMethod.BeginInvoke(2000, "Callback", new AsyncCallback(CallbackHandler), longRunningMethod); // Ti p t c v i công vi c khác. for (int count = 0; count < 15; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } } // Phương th c x lý vi c k t thúc b t ng b b ng callbacks. public static void CallbackHandler(IAsyncResult result) {
- 109 Chương 4: Ti u trình, ti n trình, và s ng b // Trích tham chi u n th hi n AsyncExampleDelegate // t th hi n IAsyncResult. AsyncExampleDelegate longRunningMethod = (AsyncExampleDelegate)result.AsyncState; // Thu l y k t qu c a phương th c th c thi b t ng b . DateTime completion = longRunningMethod.EndInvoke(result); // Hi n th thông tin k t thúc. Console.WriteLine("{0} : Callback example complete.", completion.ToString("HH:mm:ss.ffff")); } Thực thi phương thức bằng Timer 4.3 B n c n th c thi m t phương th c trong m t ti u trình riêng theo chu kỳ hay m t th i i m xác nh. Khai báo m t phương th c tr v void và ch nh n m t i tư ng làm i s . Sau ó, t o m t th hi n y nhi m System.Threading.TimerCallback tham chi u n phương th c này. Ti p theo, t o m t i tư ng System.Threading.Timer và truy n nó cho th hi n y nhi m TimerCallback cùng v i m t i tư ng tr ng thái mà Timer s truy n cho phương th c c a b n khi Timer h t hi u l c. B th c thi s ch cho n khi Timer h t hi u l c và sau ó g i phương th c c a b n b ng m t ti u trình trong thread-pool. Thông thư ng, r t h u ích khi th c thi m t phương th c m t th i i m xác nh hay nh ng th i kho ng xác nh. Ví d , b n c n sao lưu d li u lúc 1:00 AM m i ngày hay xóa vùng m d li u m i 20 phút. L p Timer giúp vi c nh th i th c thi m t phương th c tr nên d dàng, cho phép b n th c thi m t phương th c ư c tham chi u b i y nhi m nh ng th i kho ng nh t nh. Phương th c ư c tham chi u s th c thi TimerCallback trong ng c nh c a m t ti u trình trong thread-pool. Khi t o m t i tư ng Timer, b n c n ch nh hai th i kho ng (th i kho ng có th ư c ch nh là các giá tr ki u int, long, uint, hay System.TimeSpan): Giá tr u tiên là th i gian tr (tính b ng mili-giây) phương th c c a b n ư c th c • thi l n u tiên. Ch nh giá tr 0 th c thi phương th c ngay l p t c, và ch nh t o Timer tr ng thái chưa b t u System.Threading.Timeout.Infinite (unstarted). Giá tr th hai là kho ng th i gian mà Timer s l p l i vi c g i phương th c c a b n sau • l n th c thi u tiên. N u b n ch nh giá tr 0 hay Timeout.Infinite thì Timer ch th c thi phương th c m t l n duy nh t (v i i u ki n th i gian tr ban u không ph i là Timeout.Infinite). i s th hai có th cung c p b ng các tr ki u int, long, uint, hay System.TimeSpan. Sau khi t o i tư ng Timer, b n cũng có th thay i các th i kho ng ư c s d ng b i Timer b ng phương th c Change, nhưng b n không th thay i phương th c s ư c g i. Khi ã dùng xong Timer, b n nên g i phương th c Timer.Depose gi i phóng tài nguyên h
- 110 Chương 4: Ti u trình, ti n trình, và s ng b th ng b chi m gi b i Timer. Vi c h y Timer cũng h y luôn phương th c ã ư c nh th i th c thi. L p TimerExample dư i ây trình bày cách s d ng Timer g i m t phương th c có tên là TimerHandler. Ban u, Timer ư c c u hình g i TimerHandler sau hai giây và l p l i sau m t giây. Ví d này cũng trình bày cách s d ng phương th c Timer.Change thay i các th i kho ng. using System; using System.Threading; public class TimerExample { // Phương th c s ư c th c khi Timer h t hi u l c. // Hi n th m t thông báo ra c a s Console. private static void TimerHandler(object state) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), state); } public static void Main() { // T o m t th hi n y nhi m TimerCallback m i // tham chi u n phương th c tĩnh TimerHandler. // TimerHandler s ư c g i khi Timer h t hi u l c. TimerCallback handler = new TimerCallback(TimerHandler); // T o m t i tư ng tr ng thái, i tư ng này s ưc // truy n cho phương th c TimerHandler. // Trong trư ng h p này, m t thông báo s ư c hi n th . string state = "Timer expired."; Console.WriteLine("{0} : Creating Timer.", DateTime.Now.ToString("HH:mm:ss.ffff")); // T o m t Timer, phát sinh l n u tiên sau hai giây // và sau ó là m i giây. using (Timer timer = new Timer(handler, state, 2000, 1000)) { int period; // c th i kho ng m i t Console cho n khi // ngư i dùng nh p 0. Các giá tr không h p l // s s d ng giá tr m c nh là 0 (d ng ví d ). do { try { period = Int32.Parse(Console.ReadLine()); } catch { period = 0; } // Thay i Timer v i th i kho ng m i. if (period > 0) timer.Change(0, period); } while (period > 0); } // Nh n Enter k t thúc. Console.WriteLine("Main method complete. Press Enter.");
- 111 Chương 4: Ti u trình, ti n trình, và s ng b Console.ReadLine(); } } M c dù Timer thư ng ư c s d ng g i th c thi các phương th c nh ng th i kho ng, nhưng nó cũng cung c p cách th c th c thi m t phương th c m t th i i m xác nh. B n c n ph i tính toán kho ng th i gian t th i i m hi n t i n th i i m c n th c thi. Ví d dư i ây s th c hi n i u này: public static void RunAt(DateTime execTime) { // Tính kho ng th i gian t th i i m hi n t i // n th i i m c n th c thi. TimeSpan waitTime = execTime - DateTime.Now; if (waitTime < new TimeSpan(0)) waitTime = new TimeSpan(0); // T o m t th hi n y nhi m TimerCallback m i // tham chi u n phương th c tĩnh TimerHandler. // TimerHandler s ư c g i khi Timer h t hi u l c. TimerCallback handler = new TimerCallback(TimerHandler); // T o m t Timer ch phát sinh m t l n t i th i i m // ư c ch nh. Ch nh th i kho ng th hai là -1 // ngăn Timer th c thi l p l i phương th c. new Timer(handler, null, waitTime, new TimeSpan(-1)); } 4.4 Thực thi phương thức bằng cách ra hiệu đối tượng WaitHandle B n mu n th c thi m t hay nhi u phương th c m t cách t ng khi m t i tư ng d n xu t t l p System.Threading.WaitHandle i vào tr ng thái signaled. T o m t th hi n y nhi m System.Threading.WaitOrTimerCallback tham chi u n phương th c c n th c thi. Sau ó, ăng ký th hi n y nhi m và i tư ng vi thread-pool b ng phương th c tĩnh WaitHandle ThreadPool. RegisterWaitForSingleObject. 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) gi 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. B n có th c u hình thread- pool th c thi phương th c ch m t l n hay t ng ăng ký l i phương th c m i khi WaitHandle i vào tr ng thái signaled. N u WaitHandle ã tr ng thái signaled khi b n g i RegisterWaitForSingleObject, phương th c s th c thi ngay l p t c. Phương th c Unregister c a i tư ng System.Threading.RegisteredWaitHandle ( ư c tr v b i phươ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 sang tr ng thái unsignaled sau khi tr ng thái signaled. Tuy nhiên, b n cũng có th thay i tr ng thái
- 112 Chương 4: Ti u trình, ti n trình, và s ng b signaled theo ý mu n b ng l p ManualResetEvent hay Mutex. Ví d dư i ây trì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ên là 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 h i 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(); }
- 113 Chương 4: Ti u trình, ti n trình, và s ng b // 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(); } } Thực thi phương thức bằng tiểu trình mới 4.5 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 t trong 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 ng h 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ành theo 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 . 2. 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 c a nó. Ti u trình m i có tr ng thái ban u là Unstarted (m t thành viên thu c ki u li t kê System.Threading.ThreadState). 3. G i th c thi phương th c Start c a i tư ng Thread chuy n tr ng thái c a nó sang ThreadState.Running và b t u th c thi phương th c ư c tham chi u b i th hi n y nhi m ThreadStart (n u b n g i phương th c Start quá m t l n, nó s ném ngo i l System.Threading.ThreadStateException). Vì y nhi m ThreadStart khai báo không có i s , b n không th truy n d li u tr c ti p cho phương th c ư c tham chi u. truy n d li u cho ti u trình m i, b n ph i c u hình d li u là kh truy xu t i v i mã l nh ang ch y trong ti u trình m i. Cách ti p c n thông thư ng là t o m t l p óng gói c d li u c n cho ti u trình và phương th c ư c th c thi b i ti u trình. Khi mu n ch y m t ti u trình m i, b n hãy t o m t i tư ng c a l p này, c u hình tr ng thái cho nó, và r i ch y ti u trình. Dư i ây là m t ví d : using System; using System.Threading; public class ThreadExample {
- 114 Chương 4: Ti u trình, ti n trình, và s ng b // Các bi n gi thông tin tr ng thái. private int iterations; private string message; private int delay; public ThreadExample(int iterations, string message, int delay) { this.iterations = iterations; this.message = message; this.delay = delay; } public void Start() { // T o m t th hi n y nhi m ThreadStart // tham chi u n DisplayMessage. ThreadStart method = new ThreadStart(this.DisplayMessage); // 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 c a nó. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting new thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trình m i. thread.Start(); } private void DisplayMessage() { // Hi n th thông báo ra c a s Console v i s l n / / ư c ch nh (iterations), ngh gi a m i thông báo // m t kho ng th i gian ư c ch nh (delay). for (int count = 0; count < iterations; count++) { Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), message); Thread.Sleep(delay); } } public static void Main() { // T o m t i tư ng ThreadExample. ThreadExample example = new ThreadExample(5, "A thread example.", 500); // Kh i ch y i tư ng ThreadExample. example.Start(); // Ti p t c th c hi n công vi c khác. for (int count = 0; count < 13; count++) { Console.WriteLine("{0} : Continue processing...", DateTime.Now.ToString("HH:mm:ss.ffff")); Thread.Sleep(200); } // Nh n Enter k t thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } }
- 115 Chương 4: Ti u trình, ti n trình, và s ng b Điều khiển quá trình thực thi của một tiểu trình 4.6 B n c n n m quy n i u khi n khi m t ti u trình ch y và d ng, và có th t m d ng quá trình th c thi c a m t ti u trình. S d ng các phương th c Abort, Interrupt, Resume, Start, và Suspend c a Thread mà b n c n i u khi n. Các phương th c c a l p Thread ư c tóm t t trong b ng 4.1 cung c p m t cơ ch i u khi n m c cao lên quá trình th c thi c a m t ti u trình. M i phương th c này tr v ti u trình ang g i ngay l p t c. Tuy nhiên, tr ng thái c a ti u trình hi n hành óng vai trò quan tr ng trong k t qu c a l i g i phương th c, và tr ng thái c a m t ti u trình có th thay i nhanh chóng. K t qu là, b n ph i vi t mã b t và th lý các ngo i l có th b ném khi b n c i u khi n quá trình th c thi c a m t Thread. L p ThreadControlExample dư i ây trình bày cách s d ng các phương th c ư c li t kê trong b ng 4.1. Ví d này kh i ch y m t ti u trình th hai, hi n th nh kỳ m t thông báo ra c a s Console và r i i vào tr ng thái ngh (sleep). B ng cách nh p các l nh t i d u nh c l nh, b n có th gián o n, t m hoãn, ph c h i, và h y b ti u trình th hai. i u khi n quá trình th c thi c a m t ti u trình B ng 4.1 Phương th c Mô t K t thúc m t ti u trình b ng cách ném ngo i l System.Threading. ThreadAbortException trong mã l nh ang ư c ch y. Mã l nh c a ti u trình b h y có th b t ngo i l ThreadAbortException th c hi n vi c d n d p, nhưng b th c thi s t ng ném ngo i l này l n n a bo m ti u trình k t thúc, tr khi ResetAbort ư c g i. Abort tr v ngay Abort l p l c, nhưng b th c thi xác nh chính xác khi nào ngo i l b ném, do ó b n không th cho r ng ti u trình ã k t thúc b i Abort ã tr v . B n nên s d ng các k thu t ư c mô t trong m c 4.7 n u c n xác nh khi nào ti u trình này th t s k t thúc. M t khi ã h y m t ti u trình, b n không th kh i ch y l i nó. Ném ngo i l System.Threading.ThreadInterruptedException (trong mã l nh ang ư c ch y) lúc ti u trình ang tr ng thái WaitSleepJoin. i u này nghĩa là ti u trình này ã g i Sleep, Join (m c 4.7); ho c ang i WaitHandle ra hi u ( i vào tr ng thái Interrupt signaled) hay ang i m t i tư ng dùng cho s ng b ti u trình (m c 4.8). N u ti u trình này không tr ng thái WaitSleepJoin, ThreadInterruptedException s b ném sau khi ti u trình i vào tr ng thái WaitSleepJoin. Ph c h i quá trình th c thi c a m t ti u trình ã b t m hoãn (xem phương th c Suspend). Vi c g i Resume trên m t ti u trình chưa b t m Resume hoãn s sinh ra ngo i l System.Threading.ThreadStateException trong ti u trình ang g i.
- 116 Chương 4: Ti u trình, ti n trình, và s ng b Kh i ch y ti u trình m i; xem m c 4.5 bi t cách s d ng phương Start th c Start. T m hoãn quá trình th c thi c a m t ti u trình cho n khi phương th c Resume ư c g i. Vi c t m hoãn m t ti u trình ã b t m hoãn s không có hi u l c, nhưng vi c g i Suspend trên m t ti u trình chưa kh i ch y Suspend ho c ã k t thúc s sinh ra ngo i l ThreadStateException trong ti u trình ang g i. using System; using System.Threading; public class ThreadControlExample { private static void DisplayMessage() { / / L p i l p l i v i c hi n th m t thông báo ra c a s Console. while (true) { try { Console.WriteLine("{0} : Second thread running. Enter" + " (S)uspend, (R)esume, (I)nterrupt, or (E)xit.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Ngh 2 giây. Thread.Sleep(2000); } catch (ThreadInterruptedException) { // Ti u trình ã b gián o n. Vi c b t ngo i l // ThreadInterruptedException cho phép ví d này // th c hi n hành ng phù h p và ti p t c th c thi. Console.WriteLine("{0} : Second thread interrupted.", DateTime.Now.ToString("HH:mm:ss.ffff")); } catch (ThreadAbortException abortEx) { // i tư ng trong thu c tính // ThreadAbortException.ExceptionState ư c cung c p // b i ti u trình ã g i Thread.Abort. // Trong trư ng h p này, nó ch a m t chu i // mô t lý do c a vi c h y b . Console.WriteLine("{0} : Second thread aborted ({1})", DateTime.Now.ToString("HH:mm:ss.ffff"), abortEx.ExceptionState); // M c dù ThreadAbortException ã ư c th lý, // b th c thi s ném nó l n n a bo m // ti u trình k t thúc. } } } public static void Main() { // T o m t i tư ng Thread và truy n cho nó m t th hi n // y nhi m ThreadStart tham chi u n DisplayMessage.
- 117 Chương 4: Ti u trình, ti n trình, và s ng b Thread thread = new Thread(new ThreadStart(DisplayMessage)); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trình th hai. thread.Start(); // L p và x lý l nh do ngư i dùng nh p. char command = ' '; do { string input = Console.ReadLine(); if (input.Length > 0) command = input.ToUpper()[0]; else command = ' '; switch (command) { case 'S': // T m hoãn ti u trình th hai. Console.WriteLine("{0} : Suspending second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Suspend(); break; case 'R': // Ph c h i ti u trình th hai. try { Console.WriteLine("{0} : Resuming second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Resume(); } catch (ThreadStateException) { Console.WriteLine("{0} : Thread wasn't " + "suspended.", DateTime.Now.ToString("HH:mm:ss.ffff")); } break; case 'I': // Gián o n ti u trình th hai. Console.WriteLine("{0} : Interrupting second " + "thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Interrupt(); break; case 'E': // H y b ti u trình th hai và truy n m t i tư ng // tr ng thái cho ti u trình ang b h y, // trong trư ng h p này là m t thông báo. Console.WriteLine("{0} : Aborting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); thread.Abort("Terminating example."); // i ti u trình th hai k t thúc. thread.Join(); break; } } while (command != 'E');
- 118 Chương 4: Ti u trình, ti n trình, và s ng b // Nh n Enter k t thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } Nhận biết khi nào một tiểu trình kết thúc 4.7 B n mu n bi t khi nào m t ti u trình ã k t thúc. S d ng thu c tính IsAlive hay phương th c Join c a l p Thread. Cách d nh t ki m tra m t ti u trình ã k t thúc hay chưa là ki m tra thu c tính Thread.IsAlive. Thu c tính này tr v true n u ti u trình ã ư c kh i ch y nhưng chưa k t thúc hay b h y. Thông thư ng, b n s c n m t ti u trình i m t ti u trình khác hoàn t t vi c x lý c a nó. Thay vì ki m tra thu c tính IsAlive trong m t vòng l p, b n có th s d ng phương th c Thread.Join. Phương th c này khi n ti u trình ang g i d ng l i (block) cho n khi ti u trình ư c tham chi u k t thúc. B n có th tùy ch n ch nh m t kho ng th i gian (giá tr int hay TimeSpan) mà sau kho ng th i gian này, Join s h t hi u l c và quá trình th c thi c a ti u trình ang g i s ph c h i l i. N u b n ch nh m t giá tr time-out, Join tr v true n u ti u trình ã k t thúc, và false n u Join ã h t hi u l c. Ví d dư i ây th c thi m t ti u trình th hai và r i g i Join i ti u trình th hai k t thúc. Vì ti u trình th hai m t 5 giây th c thi, nhưng phương th c Join ch nh giá tr time-out là 3 giây, nên Join s luôn h t hi u l c và ví d này s hi n th m t thông báo ra c a s Console. using System; using System.Threading; public class ThreadFinishExample { private static void DisplayMessage() { // Hi n th m t thông báo ra c a s Console 5 l n. for (int count = 0; count < 5; count++) { Console.WriteLine("{0} : Second thread", DateTime.Now.ToString("HH:mm:ss.ffff")); // Ngh 1 giây. Thread.Sleep(1000); } } public static void Main() { // T o m t th hi n y nhi m ThreadStart // tham chi u n DisplayMessage. ThreadStart method = new ThreadStart(DisplayMessage); // T o m t i tư ng Thread và truy n th hi n y nhi m
- 119 Chương 4: Ti u trình, ti n trình, và s ng b // ThreadStart cho phương th c kh i d ng c a nó. Thread thread = new Thread(method); Console.WriteLine("{0} : Starting second thread.", DateTime.Now.ToString("HH:mm:ss.ffff")); // Kh i ch y ti u trình th hai. thread.Start(); // D ng cho n khi ti u trình th hai k t thúc, // ho c Join h t hi u l c sau 3 giây. if (!thread.Join(3000)) { Console.WriteLine("{0} : Join timed out !!", DateTime.Now.ToString("HH:mm:ss.ffff")); } // Nh n Enter k t thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } 4.8 Đồng bộ hóa quá trình thực thi của nhiều tiểu trình B n c n ph i h p các ho t ng c a nhi u ti u trình b o m s d ng hi u qu các tài nguyên dùng chung, và b n không làm sai l c d li u dùng chung khi m t phép chuy n ng c nh ti u trình (thread context switch) x y ra trong quá trình thay i d li u. S d ng các l p Monitor, AutoResetEvent, ManualResetEvent, và Mutex (thu c không gian tên System.Threading). Thách th c l n nh t trong vi c vi t m t ng d ng h -tr - a-ti u-trình là b o m các ti u trình làm vi c trong s hòa h p. Vi c này thư ng ư c g i là “ ng b hóa ti u trình” và bao g m: B o m các ti u trình truy xu t các i tư ng và d li u dùng chung m t cách phù h p • không gây ra sai l c. B o m các ti u trình ch th c thi khi th t s c n thi t và ph i m b o r ng chúng ch • ư c th c thi v i chi phí t i thi u khi chúng r i. Cơ ch ng b hóa thông d ng nh t là l p Monitor. L p này cho phép m t ti u trình ơn thu l y ch t (lock) trên m t i tư ng b ng cách g i phương th c tĩnh Monitor.Enter. B ng cách thu l y ch t trư c khi truy xu t m t tài nguyên hay d li u dùng chung, ta ch c ch n r ng ch có m t ti u trình có th truy xu t tài nguyên ó cùng lúc. M t khi ã hoàn t t v i tài nguyên, ti u trình này s gi i phóng ch t ti u trình khác có th truy xu t nó. Kh i mã th c hi n công vi c này thư ng ư c g i là vùng hành căng (critical section). B n có th s d ng b t kỳ i tư ng nào óng vai trò làm ch t, và s d ng t khóa this thu l y ch t trên i tư ng hi n t i. i m chính là t t c các ti u trình khi truy xu t m t tài nguyên dùng chung ph i thu l y cùng m t ch t. Các ti u trình khác khi thu l y ch t trên cùng m t i tư ng s block ( i vào tr ng thái WaitSleepJoin) và ư c thêm vào hàng s n sàng (ready queue) c a ch t này cho n khi ti u trình ch gi i phóng nó b ng phương th c tĩnh
- 120 Chương 4: Ti u trình, ti n trình, và s ng b Monitor.Exit. Khi ti u trình ch g i Exit, m t trong các ti u trình t hàng s n sàng s thu l y ch t. N u ti u trình ch không gi i phóng ch t b ng Exit, t t c các ti u trình khác s block vô h n nh. Vì v y, c n t l i g i Exit bên trong kh i finally b o m nó ư c g i c khi ngo i l x y ra. Vì Monitor thư ng xuyên ư c s d ng trong các ng d ng h -tr - a-ti u-trình nên C# cung c p h tr m c-ngôn-ng thông qua l nh lock. Kh i mã ư c gói trong l nh lock tương ương v i g i Monitor.Enter khi i vào kh i mã này, và g i Monitor.Exit khi i ra kh i mã này. Ngoài ra, trình biên d ch t ng t l i g i Monitor.Exit trong kh i finally bo m ch t ư c gi i phóng khi m t ngo i l b ném. Ti u trình ch (s h u ch t) có th g i Monitor.Wait gi i phóng ch t và t ti u trình này vào hàng ch (wait queue). Các ti u trình trong hàng ch cũng có tr ng thái là WaitSleepJoin và s ti p t c block cho n khi ti u trình ch g i phương th c Pulse hay PulseAll c a l p Monitor. Phương th c Pulse di chuy n m t trong các ti u trình t hàng ch vào hàng s n sàng, còn phương th c PulseAll thì di chuy n t t c các ti u trình. Khi m t ti u trình ã ư c di chuy n t hàng ch vào hàng s n sàng, nó có th thu l y ch t trong l n gi i phóng k ti p. C n hi u r ng các ti u trình thu c hàng ch s không thu ư c ch t, chúng s i vô h n nh cho n khi b n g i Pulse hay PulseAll di chuy n chúng vào hàng s n sàng. S d ng Wait và Pulse là cách ph bi n khi thread-pool ư c s d ng x lý các item t m t hàng i dùng chung. L p ThreadSyncExample dư i ây trình bày cách s d ng l p Monitor và l nh lock. Ví d này kh i ch y ba ti u trình, m i ti u trình (l n lư t) thu l y ch t c a m t i tư ng có tên là consoleGate. K ó, m i ti u trình g i phương th c Monitor.Wait. Khi ngư i dùng nh n Enter l n u tiên, Monitor.Pulse s ư c g i gi i phóng m t ti u trình ang ch . L n th hai ngư i dùng nh n Enter, Monitor.PulseAll s ư c g i gi i phóng t t c các ti u trình ang ch còn l i. using System; using System.Threading; public class ThreadSyncExample { private static object consoleGate = new Object(); private static void DisplayMessage() { Console.WriteLine("{0} : Thread started, acquiring lock...", DateTime.Now.ToString("HH:mm:ss.ffff")); // Thu l y ch t trên i tư ng consoleGate. try { Monitor.Enter(consoleGate); Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Acquired consoleGate lock, waiting..."); // i cho n khi Pulse ư c g i trên i tư ng consoleGate. Monitor.Wait(consoleGate); Console.WriteLine("{0} : Thread pulsed, terminating.",
- 121 Chương 4: Ti u trình, ti n trình, và s ng b DateTime.Now.ToString("HH:mm:ss.ffff")); } finally { Monitor.Exit(consoleGate); } } public static void Main() { // Thu l y ch t trên i tư ng consoleGate. lock (consoleGate) { // T o và kh i ch y ba ti u trình m i // (ch y phương th c DisplayMesssage). for (int count = 0; count < 3; count++) { (new Thread(new ThreadStart(DisplayMessage))).Start(); } } Thread.Sleep(1000); // ánh th c m t ti u trình ang ch . Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse one waiting thread."); Console.ReadLine(); // Thu l y ch t trên i tư ng consoleGate. lock (consoleGate) { // Pulse m t ti u trình ang ch . Monitor.Pulse(consoleGate); } // ánh th c t t c các ti u trình ang ch . Console.WriteLine("{0} : {1}", DateTime.Now.ToString("HH:mm:ss.ffff"), "Press Enter to pulse all waiting threads."); Console.ReadLine(); // Thu l y ch t trên i tư ng consoleGate. lock (consoleGate) { // Pulse t t c các ti u trình ang ch . Monitor.PulseAll(consoleGate); } // Nh n Enter k t thúc. Console.WriteLine("Main method complete. Press Enter."); Console.ReadLine(); } } Các l p thông d ng khác dùng ng b hóa ti u trình là các l p con c a l p System.Threading.WaitHandle, bao g m AutoResetEvent, ManualResetEvent, và Mutex. Th hi n c a các l p này có th tr ng thái signaled hay unsignaled. Các ti u trình có th s d ng
- 122 Chương 4: Ti u trình, ti n trình, và s ng b các phương th c c a các l p ư c li t kê trong b ng 4.2 ( ư c th a k t l p WaitHandle) i vào tr ng thái WaitSleepJoin và i tr ng thái c a m t hay nhi u i tư ng d n xu t t WaitHandle bi n thành signaled. B ng 4.2 Các phương th c c a WaitHandle dùng ng b hóa quá trình th c thi c a các ti u trình Phương th c Mô t Ti u trình g i phương th c tĩnh này s i vào tr ng thái WaitSleepJoin và i b t kỳ m t trong các i tư ng WaitHandle thu c m t m ng WaitAny WaitHandle bi n thành signaled. B n cũng có th ch nh giá tr time- out. Ti u trình g i phương th c tĩnh này s i vào tr ng thái WaitSleepJoin và i t t c các i tư ng WaitHandle trong m t m ng WaitHandle bi n thành signaled. B n cũng có th ch nh giá tr time-out. Phương th c WaitAll WaitAllExample trong m c 4.2 ã trình bày cách s d ng phương th c WaitAll. Ti u trình g i phương th c này s i vào tr ng thái WaitSleepJoin và i m t i tư ng WaitHandle c th bi n thành signaled. Phương th c WaitOne WaitingExample trong m c 4.2 ã trình bày cách s d ng phương th c WaitOne. i m khác bi t chính gi a các l p AutoResetEvent, ManualResetEvent, và Mutex là cách th c chúng chuy n tr ng thái t signaled thành unsignaled, và tính kh ki n (visibility) c a chúng. L p AutoResetEvent và ManualResetEvent là c c b i v i m t ti n trình. ra hi u m t AutoResetEvent, b n hãy g i phương th c Set c a nó, phương th c này ch gi i phóng m t ti u trình ang i s ki n. AutoResetEvent s t ng tr v tr ng thái unsignaled. Ví d trong m c 4.4 ã trình bày cách s d ng l p AutoResetEvent. L p ManualResetEvent ph i ư c chuy n i qua l i gi a signaled và unsignaled b ng phương th c Set và Reset c a nó. G i Set trên m t ManualResetEvent s t tr ng thái c a nó là signaled, gi i phóng t t c các ti u trình ang i s ki n. Ch khi g i Reset m i làm cho ManualResetEvent tr thành unsignaled. M t Mutex là signaled khi nó không thu c s h u c a b t kỳ ti u trình nào. M t ti u trình giành quy n s h u Mutex lúc kh i d ng ho c s d ng m t trong các phương th c ư c li t kê trong b ng 4.2. Quy n s h u Mutex ư c gi i phóng b ng cách g i phương th c Mutex.ReleaseMutex (ra hi u Mutex và cho phép m t ti u trình khác thu l y quy n s h u này). Thu n l i chính c a Mutex là b n có th s d ng chúng ng b hóa các ti u trình qua các biên ti n trình. M c 4.12 ã trình bày cách s d ng Mutex. Ngoài các ch c năng v a ư c mô t , i m khác bi t chính gi a các l p WaitHandle và l p Monitor là l p Monitor ư c hi n th c hoàn toàn b ng mã l nh ư c-qu n-lý, trong khi các l p WaitHandle cung c p v b c cho các ch c năng bên dư i c a c a h i u hành. i u này d n n h qu là: S d ng l p Monitor ng nghĩa v i vi c mã l nh c a b n s kh chuy n hơn vì không • b l thu c vào kh năng c a h i u hành bên dư i.
- 123 Chương 4: Ti u trình, ti n trình, và s ng b B n có th s d ng các l p d n xu t t WaitHandle ng b hóa vi c th c thi c a • các ti u trình ư c-qu n-lý và không- ư c-qu n-lý, trong khi l p Monitor ch có th ng b hóa các ti u trình ư c-qu n-lý. 4.9 Tạo một đối tượng tập hợp có tính chất an-toàn-về- tiểu-trình B n mu n nhi u ti u trình có th ng th i truy xu t n i dung c a m t t p h p m t cách an toàn. S d ng l nh lock ng b hóa các ti u trình truy xu t n t p h p, ho c truy xu t t p h p thông qua m t v b c có tính ch t an-toàn-v -ti u-trình (thread- safe). Theo m c nh, các l p t p h p chu n thu c không gian tên System.Collections và System.Collections.Specialized s h tr vi c nhi u ti u trình ng th i c n i dung c a t p h p. Tuy nhiên, n u m t hay nhi u ti u trình này s a i t p h p, nh t nh b n s g p r c r i. ó là vì h i u hành có th làm t quãng các hành ng c a ti u trình trong khi t p h p ch m i ư c s a i m t ph n. i u này s ưa t p h p vào m t tr ng thái vô nh, ch c ch n khi n cho m t ti u trình khác truy xu t t p h p th t b i, tr v d li u sai, ho c làm h ng t p h p. S d ng “ ng b hóa ti u trình” s sinh ra m t chi phí hi u năng. C t ph p là không-an-toàn-v -ti u-trình (non-thread-safe) như m c nh s cho hi u năng t t hơn i v i các trư ng h p có nhi u ti u trình không ư c dùng n. Ttc các t p h p thông d ng nh t u hi n th c m t phương th c tĩnh có tên là Synchronized; bao g m các l p: ArrayList, Hashtable, Queue, SortedList, và Stack (thu c không gian tên System.Collections). Phương th c Synchronized nh n m t i tư ng t p h p (v i ki u phù h p) làm i s và tr v m t i tư ng cung c p m t v b c ư c- ng-b - hóa (synchronized wrapper) bao l y i tư ng t p h p ã ư c ch nh. i tư ng v b c này có cùng ki u v i t p h p g c, nhưng t t c các phương th c và thu c tính dùng c và ghi t p h p b o m r ng ch m t ti u trình có kh năng truy xu t n i dung c a t p h p cùng lúc. o n mã dư i ây trình bày cách t o m t Hashtable có tính ch t an-toàn-v -ti u-trình (b n có th ki m tra m t t p h p có ph i là an-toàn-v -ti u-trình hay không b ng thu c tính IsSynchronized). // T o m t Hashtable chu n. Hashtable hUnsync = new Hashtable(); // T o m t v b c ư c- ng-b -hóa. Hashtable hSync = Hashtable.Synchronized(hUnsync); Các l p t p h p như HybridDictionary, ListDictionary, và StringCollection (thu c không gian tên System.Collections.Specialized) không hi n th c phương th c Synchronized. cung c p kh năng truy xu t an-toàn-v -ti u-trình n th hi n c a các l p này, b n ph i hi n th c quá trình ng b hóa (s d ng i tư ng ư c tr v t thu c tính SyncRoot) như ư c trình bày trong o n mã dư i ây:
- 124 Chương 4: Ti u trình, ti n trình, và s ng b // T o m t NameValueCollection. NameValueCollection nvCollection = new NameValueCollection(); // Thu l y ch t trên NameValueCollection trư c khi th c hi n s a i. lock (((ICollection)nvCollection).SyncRoot) { // S a i NameValueCollection... } Chú ý r ng l p NameValueCollection d n xu t t l p NameObjectCollectionBase, l p cơ s này s d ng cơ ch hi n th c giao di n tư ng minh hi n th c thu c tính ICollection.SyncRoot. Như ã ư c trình bày, b n ph i ép NameValueCollection v ICollection trư c khi truy xu t thu c tính SyncRoot. Vi c ép ki u là không c n thi t iv i các l p t p h p chuyên bi t như HybridDictionary, ListDictionary, và StringCollection (các l p này không s d ng cơ ch hi n th c giao di n tư ng minh hi n th c SyncRoot). N u c n s d ng r ng kh p l p t p h p ã ư c ng b hóa, b n có th ơn gi n hóa mã l nh b ng cách t o m t l p m i d n xu t t l p t p h p c n s d ng. K ti p, chép è các thành viên c a l p cơ s cung c p kh năng truy xu t n i dung c a t p h p và th c hi n ng b hóa trư c khi g i thành viên l p cơ s tương ương. B n có th s d ng l nh lock m t cách bình thư ng ng b hóa i tư ng ư c tr v b i thu c tính SyncRoot c a l p cơ s như ã ư c th o lu n trên. Tuy nhiên, b ng cách t o l p d n xu t, b n có th hi n th c các k thu t ng b hóa cao c p hơn, ch ng h n s d ng System.Threading.ReaderWriterLock cho phép nhi u ti u trình c nhưng ch m t ti u trình ghi. Khởi chạy một tiến trình mới 4.10 B n c n th c thi m t ng d ng trong m t ti n trình m i. S d ng i tư ng System.Diagnostics.ProcessStartInfo ch nh các chi ti t cho ng d ng c n ch y. Sau ó, t o i tư ng System.Diagnostics.Process mô t ti n trình m i, gán i tư ng ProcessStartInfo cho thu c tính StartInfo c a i tư ng Process, và r i kh i ch y ng d ng b ng cách g i Process.Start. L p Process cung c p m t d ng bi u di n ư c-qu n-lý cho m t ti n trình c a h i u hành và cung c p m t cơ ch ơn gi n mà thông qua ó, b n có th th c thi c ng d ng ư c- qu n-lý l n không- ư c-qu n-lý. L p Process hi n th c b n phiên b n n p ch ng cho phương th c Start (b n có th s d ng phương th c này kh i ch y m t ti n trình m i). Hai trong s này là các phương th c tĩnh, cho phép b n ch nh tên và các i s cho ti n trình m i. Ví d , hai l nh dư i ây u th c thi Notepad trong m t ti n trình m i: // Th c thi notepad.exe, không có is. Process.Start("notepad.exe"); // Th c thi notepad.exe, tên file c n m là is. Process.Start("notepad.exe", "SomeFile.txt"); Hai d ng khác c a phương th c Start yêu c u b n t o i tư ng ProcessStartInfo ư c c u hình v i các chi ti t c a ti n trình c n ch y; vi c s d ng i tư ng ProcessStartInfo cung c p m t cơ ch i u khi n t t hơn trên các hành vi và c u hình c a ti n trình m i. B ng 4.3 tóm t t m t vài thu c tính thông d ng c a l p ProcessStartInfo. [ B ng 4.3 Các thu c tính c a l p ProcessStartInfo
- 125 Chương 4: Ti u trình, ti n trình, và s ng b Thu c tính Mô t Các i s dùng truy n cho ti n trình m i. Arguments N u Process.Start không th kh i ch y ti n trình ã ư c ch nh, nó s ném ngo i l System.ComponentModel.Win32Exception. N u ErrorDialog ErrorDialog là true, Start s hi n th m t thông báo l i trư c khi ném ngo i l . Tên c a ng d ng. B n cũng có th ch nh b t kỳ ki u file nào mà b n ã c u hình ng d ng k t giao v i nó. Ví d , n u b n ch nh FileName m t file v i ph n m r ng là .doc hay .xls, Microsoft Word hay Microsoft Excel s ch y. Mt thành viên thu c ki u li t kê System.Diagnostics. ProcessWindowStyle, i u khi n cách th c hi n th c a c a s . Các WindowStyle giá tr h p l bao g m: Hidden, Maximized, Minimized, và Normal. Tên y c a thư m c làm vi c. WorkingDirectory Khi ã hoàn t t v i m t i tư ng Process, b n nên h y nó gi i phóng các tài nguyên h th ng—g i Close, Dispose, ho c t o i tư ng Process bên trong t m v c c a l nh using. Vi c h y m t i tư ng Process không nh hư ng lên ti n trình h th ng n m dư i, ti n trình này v n s ti p t c ch y. Ví d dư i ây s d ng Process th c thi Notepad trong m t c a s tr ng thái phóng to và m m t file có tên là C:\Temp\file.txt. Sau khi t o, ví d này s g i phương th c d ng ti u trình ang ch y cho n khi ti n trình k t thúc ho c giá tr Process.WaitForExit time-out ( ư c ch nh trong phương th c này) h t hi u l c. using System; using System.Diagnostics; public class StartProcessExample { public static void Main () { // T o m t i tư ng ProcessStartInfo và c u hình cho nó // v i các thông tin c n thi t ch y ti n trình m i. ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = "notepad.exe"; startInfo.Arguments = "file.txt"; startInfo.WorkingDirectory = @"C:\Temp"; startInfo.WindowStyle = ProcessWindowStyle.Maximized; startInfo.ErrorDialog = true; // T o m t i tư ng Process m i. using (Process process = new Process()) { // Gán ProcessStartInfo vào Process. process.StartInfo = startInfo; try { // Kh i ch y ti n trình m i. process.Start();
ADSENSE
CÓ THỂ BẠN MUỐN DOWNLOAD
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn