Simple Way: Ví Dụ Nhỏ Về Đa Luồng - MultiThreading C# - Blogger
Có thể bạn quan tâm
No matter where you live. No matter what you believe. One date will unite us all.
- Trang chủ
- C# Cơ bản
- C# Nâng cao
- C# Keywords
- About me
Thứ Sáu, 18 tháng 6, 2010
In C# Basic, C# Code Snippets // // 12 comments Ví Dụ Nhỏ Về Đa Luồng - MultiThreading C#- Sơ qua về luồng (Thread) Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn ngữ C# cho dễ hiểu. Trước tìm hiểu nó cũng vất vả vì nó khó hiểu giờ muốn giúp chút xíu gì đó cho các bạn (Bạn sẽ cảm thấy vô cùng đơn giản nếu làm việc nhiều với nó, đó chỉ là do kỹ năng của mình yếu lên cảm thấy phức tạp) Một luồng là một chuỗi liên tiếp những sự thực thi (mã lệnh hay câu lệnh) trong chương trình (ứng dụng). Trong một chương trình C#, dễ thấy việc thực thi được bắt đầu bằng phương thức main() và tiếp tục cho đến khi kết thúc hàm main(). Cấu trúc này rất hay cho những chương trình có một chuỗi xác định những nhiệm vụ liên tiếp, nhưng thường thì trong một chương trình ứng có nhiều hơn một công việc vào cùng một lúc. Một ví dụ rất hay và khá thực tế mà mình thấy trên diễn đàn tin học của "can_qua", các bạn cùng tham khảo
- Ví dụ nhỏ về đa luồng Ví dụ này mình sẽ mô tả 2 luồng (cho đơn giản) được thực thi cùng một lúc. Ở đây thì bạn cứ tưởng tượng ra rằng có hai thằng tên là A và B thi đếm từ 0 cho đến 100, thằng nào đếm xong trước thì báo cáo và được về chỗ. Tương ứng mình sẽ tạo ra 2 phương thức A() và B() (mỗi luồng sẽ xử lý một thằng). void A() { for(int i=0; i<=100; i++) { Console.WriteLine(i.ToString()); } Console.WriteLine("A đã đọc xong"); // Báo cáo đã đọc xong } void B() { for(int i=0; i<=100; i++) { Console.WriteLine(i.ToString()); } Console.WriteLine("B đã đọc xong"); // Báo cáo đã đọc xong } Bây giờ thầy giáo (hoặc là bạn) bỗng cao hứng gọi 2 thằng lên thi đọc --> 2 thằng A và B cùng đọc Đến đây trong phương thức hàm main() của chương trình bạn sẽ phải gọi 2 thằng này static void main() { ThreadStart ts1 = new ThreadStart(A); // Chỉ định thằng A lên đọc ThreadStart ts2 = new ThreadStart(B); // Chỉ định thằng B lên đọc // Sẵn sàng cho cuộc đấu (thi đếm nhanh :D) Thread tA = new Thread(ts1); Thread tB = new Thread(ts2); // Bắt đầu bấm giờ tA.Start(); tB.Start(); tA.Join(); tB.Join(); // Hai thằng tranh nhau đếm Console.WriteLine("Cuộc thi kết thúc"); // Chờ đến khi 2 thằng đọc xong, không biết thằng nào sẽ thắng :D Console.ReadLine(); } // Thư viện tham chiếu nằm trong namespace System.Threading; // Bạn cần khai báo sử dụng nó using Sytem.Threading;
- Truyền tham số cho Thread Có nhiều cách truyền tham số, tuỳ theo nhu cầu mà dùng sao cho phù hợp Thông qua phương thức Start(object) thì bạn có thể truyền tham số theo cách này.Ví dụ: using System; using System.Threading; class ThreadSample { public static void Main() { Thread newThread = new Thread(ThreadSample.DoWork); newThread.Start(100); // Dữ liệu truyền vào là một số nguyên // Để Start luồng sử dụng phương thức thể hiện (instance method) // thì trước tiên ta cần khởi tạo nó trước khi gọi ThreadSample worker = new ThreadSample(); newThread = new Thread(worker.DoMoreWork); newThread.Start("Truyền đối tượng cho thread thực thi"); // Nếu biết trước được đối tượng truyền vào thì ta cần ghép kiểu cho nó // để việc sử dụng được hiệu quả hơn } public static void DoWork(object data) { Console.WriteLine("Ðây là luồng tĩnh."); Console.WriteLine("Dữ liệu truyền vào: Data = {0}", data); } public void DoMoreWork(object data) { Console.WriteLine("Đây là luồng cần được khởi tạo"); Console.WriteLine("Dữ liệu truyền vào là: Data = {0}", data); } } Đôi khi ta cũng sử dụng ThreadPool cho việc khởi chạy một luồng mới với tham số là _Param ThreadPool.QueueUserWorkItem(new WaitCallback(_ThreadProc), _Param); Bạn hãy tham khảo về nó tại đây: http://dotnetperls.com/threadpool
- Chờ đợi một luồng khác Bằng việc sử dụng phương thức Join(); ta có thể cho phép chờ đợi một luồng khác thực hiện xong (để thu thập dữ liệu chẳng hạn - do chia nhỏ công việc mà), thì luồng đã gọi nó mới tiếp tục được công việc của nó static void Main(string[] args) { Console.WriteLine("Main thread: Gọi luồng thứ 2 ThreadProc()..."); Thread t = new Thread(new ThreadStart(ThreadProc)); t.Start(); for (int i = 0; i < 50; i++) { Console.WriteLine("Main thread: Do Some Work."); Thread.Sleep(0); } Console.WriteLine("Main thread finished: And call t.Join()"); Console.WriteLine("Main thread tạm thời đang được dừng lại"); t.Join(); // Dừng tại đây // Sau khi ThreadProc hoàn tất Main thread tiếp tục công việc của nó // Tiếp tục thực thi 3 dòng lệnh tiếp theo Console.WriteLine("Thread.Join() has returned."); Console.WriteLine("Main đã làm xong việc"); Console.ReadLine(); } public static void ThreadProc() { for (int i = 0; i < 100; i++) { Console.WriteLine("ThreadProc: {0}", i); Thread.Sleep(0); } } Đối số cho Join() có thể là int hoặc TimeSpan, khoảng thời gian giới hạn mà Main thread có thể chờ được, ví dụ t.Join(10000); nghĩa là, sau 10s mà ThreadProc chưa làm xong việc của nó thì Main thread không chờ nữa, tiếp tục công việc khác
Vấn đề quan trọng là bạn phải tìm ra một cách nào đó để chia một công việc lớn thành những công việc nhỏ mà trong đó có những việc có thể thực hiện một cách đồng thời. Ví dụ, mẹ giao việc cho con là "làm việc xong mới được đi coi xi-nê". "Công việc lớn" này có thể gồm 3 việc nhỏ "quét nhà", "rửa chén", và đi coi "xi-nê". Trong đó chỉ được "coi xi-nê" sau khi làm xong hai việc kia. Rõ ràng là bạn muốn làm xong việc nhà càng sớm càng tốt để vi vút, nên bạn kêu thằng em bạn quét nhà, bạn thì rửa chén, cả hai người cùng làm đồng thời. Rửa chén xong trước, bạn phải đợi thằng em bạn thông báo là quét nhà cũng xong thì bạn mới vù đi coi xi-nê được. Như vậy multithread cho "rửa chén" và "quét nhà" làm tăng hiệu suất thực hiện công việc của bạn (so với việc bạn làm tuần tự rửa chén, quét nhà, coi xi-nê).
12 comments:
bài viết rất hay, bạn có thể viết bài giới thiệu cơ bản về dử dụng các phương thức trong Sytem.Threading đc không, mình mới học qua c# và đang tìm hiểu về multithread programming :D, cám ơn bạn
Ok, mình sẽ sớm gửi bài mô tả về nó. Cám ơn bạn nhiều.
bạn ơi bài bạn hay lắm nhưng mà chỗ này Thread newThread = new Thread(ThreadSample.DoWork);sao không ghi là Thread newThread = new Thread(new ThreadStart(ThreadSample.DoWork));mất đâu cái ThreadStart rồi.bạn giải thích dùm nha.
Chào Alex,Cái này hơi khó giải thích, ai rành về phần này xin giải thích chi tiết giùm.Nhưng mình xin mạo muội giải thích như sau:Khi khởi tạo một Thread, thì tham số khởi tạo của nó có thể là ThreadStart hoặc ParameterizedThreadStart.Bản chất của ParameterizedThreadStart là một delegate trỏ tới một đối tượng mà cụ thể ở đây nó là phương thức. Nên tham số truyền vào ở ví dụ trên là một phương thức.Nếu chưa rõ bạn xem lại phần delegate và giải thích chi tiết trên MSDN tại địa chỉ này nhéhttp://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspxCám ơn Alex nhé!
mình rút ra ý kiến thế này bạn coi đúng không nhasử dụng ThreadStart khi đối tượng đó không có tham số(bắt buộc).sử dụng ParameterizedThreadStart khi đối tượng đó có tham số(bắt buộc).chắc vc# cho ParameterizedThreadStart là mặc định nên có thể bỏ new ParameterizedThreadStart đi.đối với ThreadStart object phải là static object(cái này không biết vì sao phải là static).còn đối với ParameterizedThreadStart thì sao cũng được.mình rút ra được vài nhận xét như trên. bạn thử xem có đúng không.nhờ bạn mình hiểu hơn ra được thread rồi đó. lúc giờ toàn debug code người ta nhưng nói chung không hiểu lắm. chỉ 1 câu nói của bạn mà hiểu rồi. giống như ngộ đạo đó.cảm ơn bạn nhiều
ừ đúng, ThreadStart khi khởi tạo thì tham số của nó phải là phương thức kiểu void và không có đối số.Nhưng tham số của ThreadStart không nhất thiết là phải tĩnh bạn ạ, chỉ cần biết nó là void() thôi và nó có thể là phương thức của một đối tượng nào đó.
đúng rồi không cần staticmình xóa cái static ở ThreadProc mà quên tạo thể hiện của nó trong hàm main nên không gọi được. mình check lại được rồi.cảm ơn bạn nhiều lắm.
Còn mình thì có ý kiến khác bạn hãy nhìn kỹ 2 đoạn code này nhé-------------------------------------------- ThreadStart ts1 = new ThreadStart(A); Thread tA = new Thread(ts1);--------------------------------------------và-------------------------------------------- Thread tA = new Thread(new ThreadStart(A));--------------------------------------------Chắc là bạn hiểu được đây chỉ là cách viết thôi đúng không nào?
@Hùng Cường: Chào bạn, đây chỉ là 02 cách viết khác nhau mà IDE hỗ trợ. Cả hai cách khi khởi tạo 01 Thread bạn đều truyền tham số là 01 ThreadStart. :)
anh ơi! cách truyền tham số cho thread chỉ sử dung được trên console thôi dùng trên winform thì lỗi.
@Son: Việc thực hiện đa luồng không phụ vào em viết trên Console hay Winform. Em cần chú ý đến qui trình và tham số.Nếu chưa fix được lỗi em có thể đưa gia để mọi người cùng giúp!
Các bạn cho mình hỏi:Giả sử mình cần download 1000 file từ máy A về máy B thông qua FTP.Giờ mình muốn multi thread cho nó rút ngắn thời gian tải Vậy mình làm thế nào để chia đều 1000 file cho 10 thread, mỗi thread sẽ phụ trách tải 100 file.Và khi nào tất cả các thread đều tải xong thì ghi log báo cáo: bao nhiêu file thành công, bao nhiêu file thất bại....Cảm ơn các bạn nhiều
Bài đăng Mới hơn Bài đăng Cũ hơn Trang chủEmail Newsletter
Subscribe to our newsletter to get the latest updates to your inbox. ;-)
Your email address is safe with us!
Labels
An toàn thông tin Audio Story Âm Nhạc Cuộc Sống C# Advanced C# Basic C# Code Snippets C# Keywords C++ Keywords Chuyện đời thường Complexity - Cryptography Computer Science Desktop Solution Ebooks Giáo trình C++ IDE - Programming Tools Kiến thức chung Lập trình cơ sở Lập trình hàm trong .NET Lập trình thiết bị di động Ngôn ngữ lập trình C# Ngôn ngữ lập trình C++ Photoshop Stories For Children Thơ ngâm dấm Thơ tình Thơ tuyệt cú mèo Tin Tức Tin Tức Công Nghệ Ứng dụng .NET Vấn đề mạng Vectors - EPS - AI Web SolutionRecent Comments
Popular Posts
-
Trao đổi dữ liệu giữa các form I) Giới thiệu: Với ứng dụng WinForms, trong một số trường hợp chúng ta cần phải trao đổi dữ liệu từ form này sang form khác. Đây là vấn ... -
About Me Simple Way etc! Bạn là ai? Tôi sinh ra và lớn lên tại Hưng Yên, cái sở thích được ôm máy tính, làm việc với máy tính của tôi xuất phát từ... - Ví Dụ Nhỏ Về Đa Luồng - MultiThreading C# Sơ qua về luồng (Thread) Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn n...
-
Delegate và Event trong C# Giới thiệu: Mọi người học lập trình C# chắc đã biết đến lập trình điều kiển sự kiện. C# thêm vào thế giới lập trình điều kiển sự kiện thô... -
Kd Player 0.9.6 Skin WMP11 phiên bản 2 Phiên bản 2 đã ra lò, mời mọi người thưởng thức... Xem xong bài này thì bạn nên xem bài (tạo chứng chỉ cho máy - để khi sử dụng KD đọc fi...
-
Acronis Disk Director Suite 10 Bootable ISO Acronis Disk Director Suite 10 Bootable ISO Acronis Disk Director Suite là sản phẩm của hãng Acronis, các bạn đã từng biết đến Acronis...
-
Hướng dẫn bấm cáp mạng RJ45 Gần đây thấy nhiều member "tự nguyện" đưa đầu cho tụi cửa hàng "chém" vì khi mua cáp mạng phải nhờ nó bấm dùm . Đã vậy c...
-
Bài toán ba lô - The kanpsack Algorithm Bài toán : Cho 1 cái ba lô được nhét đầy các đồ vật cho ở hình dưới (trọng lượng tính theo grams). Biết rằng ba lô nặng 3064 grams, bạn có t...
- Lấy Handle, Title của cửa sổ Windows đang hoạt động - C# Snippet sử dụng hàm thư viện để lấy Handle của cửa sổ chương trình đang hoạt động sử dụng C# // Khai báo thư viện hàm using System...
- Key Logger C# .NET - Creating the Project Lời nói đầu: Tìm hiểu cách một chương trình keylogger đơn giản với sự giúp đỡ của C # và NET Framework. Chương trình mẫu trong bài viết sẽ...
Web Development
- Học thiết kế web theo chuẩn. Giao diện với CSS 4 năm trước
- WebArt’s Blog
Liên kết nhanh
- Đọc Thử Xem
- Chủ đề cho 3110c
- KD Player 0.9.6 WMP11
- Tiện ích cho Firefox
- When Angels Cry
- Level Editor - Giải trí
- Media Player C# - MCI
- Keylogger C#.NET
- MID application
- C# Threading
- Get Yahoo Avatar
- Đo chỉ số cơ thể BMI
Labels
- An toàn thông tin (6)
- Audio Story (11)
- Âm Nhạc Cuộc Sống (4)
- C# Advanced (7)
- C# Basic (24)
- C# Code Snippets (11)
- C# Keywords (15)
- C++ Keywords (3)
- Chuyện đời thường (9)
- Complexity - Cryptography (5)
- Computer Science (1)
- Desktop Solution (14)
- Ebooks (1)
- Giáo trình C++ (21)
- IDE - Programming Tools (1)
- Kiến thức chung (4)
- Lập trình cơ sở (1)
- Lập trình hàm trong .NET (3)
- Lập trình thiết bị di động (1)
- Ngôn ngữ lập trình C# (7)
- Ngôn ngữ lập trình C++ (13)
- Photoshop (2)
- Stories For Children (11)
- Thơ ngâm dấm (3)
- Thơ tình (2)
- Thơ tuyệt cú mèo (1)
- Tin Tức (2)
- Tin Tức Công Nghệ (1)
- Ứng dụng .NET (10)
- Vấn đề mạng (3)
- Vectors - EPS - AI (1)
- Web Solution (2)
HIT Number
Popular Posts
- Ví Dụ Nhỏ Về Đa Luồng - MultiThreading C# Sơ qua về luồng (Thread) Bài viết này mình sẽ hướng dẫn cho các bạn mới tìm hiểu về đa luồng và ứng dụng của nó và được mô tả trên ngôn n...
-
Trao đổi dữ liệu giữa các form I) Giới thiệu: Với ứng dụng WinForms, trong một số trường hợp chúng ta cần phải trao đổi dữ liệu từ form này sang form khác. Đây là vấn ... -
Delegate và Event trong C# Giới thiệu: Mọi người học lập trình C# chắc đã biết đến lập trình điều kiển sự kiện. C# thêm vào thế giới lập trình điều kiển sự kiện thô... -
About Me Simple Way etc! Bạn là ai? Tôi sinh ra và lớn lên tại Hưng Yên, cái sở thích được ôm máy tính, làm việc với máy tính của tôi xuất phát từ... - Hướng dẫn bấm cáp mạng RJ45 Gần đây thấy nhiều member "tự nguyện" đưa đầu cho tụi cửa hàng "chém" vì khi mua cáp mạng phải nhờ nó bấm dùm . Đã vậy c...
-
Kd Player 0.9.6 Skin WMP11 phiên bản 2 Phiên bản 2 đã ra lò, mời mọi người thưởng thức... Xem xong bài này thì bạn nên xem bài (tạo chứng chỉ cho máy - để khi sử dụng KD đọc fi...
- Key Logger C# .NET - Creating the Project Lời nói đầu: Tìm hiểu cách một chương trình keylogger đơn giản với sự giúp đỡ của C # và NET Framework. Chương trình mẫu trong bài viết sẽ...
- Tổng quan về nén dữ liệu I. Giới thiệu chung 1. Nguyên tắc của nén dữ liệu Thông thường, hầu hết các tập tin trong máy tính có rất nhiều thông tin dư thừa, việc thực...
-
Edit Control With Hint C# - Tạo mặt nạ gợi nhớ cho các controls nhập văn bản C# Bạn đang muốn tạo một mặt nạ gợi nhớ trên ô nhập tài khoản người dùng hoặc mật khẩu tương tự như các ứng dụng có yêu cầu đăng nhập trên các ... - Abstract Class và Sealed class Abstract : - C# cho phép lớp phương thức hay thuộc tính có thể khai báo abstract. Một lớp abstract không được thể hiện và một phương thứ...
Liên kết blog
- Wikibooks User:Sugarcannerainbow - Cabayi renamed user Sugarcannerainbow (0 edits) to Renamed user dd3066f28cb64b8f0e13cab5ae47b2dc per request 6 giờ trước
- IT - Let's take the passion Tạo project PHALCON chơi cho vui ;) - Hi, mình không viết cụ thể từng bước, chỉ viết tóm lược các bước cần phải làm từ khi tạo server cho tới khi lấy code phalcon về thôi nhé. Go!!!! Tạo server... 6 năm trước
- YinYang's Blog C# – Tìm hiểu về Closure - Liên quan đến delegate, closure là một khái niệm cần được hiểu rõ để tránh vấn đề khó hiểu mà bạn có thể gặp phải. Để hiểu thế nào là closure trong C... 10 năm trước
- - Prison Code Breaker Diary - Migrate to my own blog page - I've ran this blog years ago and just moved to my site at: http://petehouston.com and you can read my blog at: http://blog.petehouston.com Feel free to con... 12 năm trước
- Toàn - Watashj Loại bỏ thói trì hoãn - *(Dân trí) - “Tôi biết mình phải làm gì. Tôi hiểu rõ những ích lợi của việc đó. Tôi cũng biết những hậu quả tiêu cực nếu mình không làm nó. Tôi có đủ năng... 13 năm trước
- Nguyễn Thoại's Blog - Chia sẽ những kĩ thuật lập trình .NET Thoại đã trở lại, lợi hại gấp nhiều lần - Hai năm gần đây mình không viết bài nào vì dành nhiều thời gian cho những quyết định lớn chẳng hạn như .... cưới vợ. Hiện nay tình hình đã tạm ổn định, tổn... 14 năm trước
- Dot Net Perls -
About Me
- Momen
- Unknown
- ducgiang_fami
Designed By Blogtipsntricks. In Association With Tozilnutpam and Praverb Dot Net.
Từ khóa » Ví Dụ đa Luồng
-
Lập Trình đa Luồng Trong Java (Java Multi-threading) | TopDev
-
Lập Trình Đa Luồng Trong JAVA - NIIT - ICT Hà Nội
-
Ví Dụ Về đa Luồng - Hệ điều Hành
-
Đa Luồng Nhanh Hay Chậm? - CodeLearn
-
Tìm Hiểu Về Xử Lí đa Luồng Trong Java - Viblo
-
Đa Luồng Trong Python (multithreading) - Viblo
-
Luồng Thực Thi (thread), Lập Trình đa Luồng (multithreading) | Tự Học ICT
-
Đa Luồng (Multithread) Trong C++ - Hoclaptrinh
-
Đa Luồng (Multithreading) - .vn
-
Bài 31: Đa Luồng Trong Java - Lập Trình Java Cơ Bản
-
Cách Thực Hiện đa Luồng - Multithreading Với Node.js
-
Đa Luồng Trong C# - Lập Trình C#
-
Hướng Dẫn Lập Trình đa Luồng Trong C# - Openplanning
-
Đa Luồng Trong Java Hướng Dẫn Với Chương Trình & Ví Dụ - SoftGeek