- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
- Hướng dẫn khóa file bằng nhiều process id, không cho xóa tập tin
- Hướng dẫn cách tạo Product Id cho ứng dụng phần mềm XXXXX-XXXXX-XXXXX-XXXXX
Giới thiệu và hướng dẫn sử dụng Thread và Multi Thread, Process trong visual dot net
Hôm nay, mình xin hướng dẫn các bạn khái niệm về Thread và multi Thread, và Process được sử dụng như thế nào.
Một số khái niệm:
Process là gì?
Process (hay còn gọi là tiến trình) : Khi chạy một ứng dụng, hệ điều hành sẽ cấp phát riêng cho ứng dụng đó bộ nhớ và các tài nguyên khác. Bộ nhớ và tài nguyên vật lý riêng biệt này được gọi là một tiến trình. Các tài nguyên và bộ nhớ của một tiến trình thì chỉ tiến trình đó được phép truy cập.
Lưu ý Một ứng dụng thường có một tiến trình nhưng cũng có thể có nhiều tiến trình ! Tiến trình ≠ Ứng dụng
Tuyến (đoạn) – Thread :
Trong hệ thống, một tiến trình có thể có một hoặc nhiều chuỗi thực hiện tách biệt nhau và có thể chạy đồng thời. Mỗi chuỗi thực hiện này được gọi là một tuyến (Thread). Trong một ứng dụng, Thread khởi tạo đầu tiên gọi là Thread sơ cấp hay Thread chính. (Chính là phương thức Sub Main).
Đa nhiệm:
– Mutitasking : Là khả năng của hệ điều hành làm nhiều công việc (ví dụ chạy nhiều ứng dụng) tại một thời điểm.
Một số hình ảnh về mô hình đơn tuyến và đa tuyến
Có 2 mô hình thread là Apartment Threading và Free Threading .
- Apartment-threading
- Free threading
Trong mô hình thứ hai, do các thread có thể cùng chia sẻ và truy cập dữ liệu chung, do vậy có thể xảy ra xung đột (khiến kết quả không như mong muốn).
Ví dụ:
Kết quả không thể xác định được (không nhất quán) khi nhiều thread cùng truy cập
Ưu điểm và hạn chế của cơ chế đa tuyến
Ưu điểm:
Trong một ứng dụng có thể cho nhiều "công việc" (tuyến-thread) được thực thi đồng thời. Các công việc này hoạt động độc lập với nhau và đóng vai trò như những chương trình riêng biệt. Một thread có thể treo (Hang) mà không ảnh hưởng đến các thread khác. Đa tuyến đặc biệt hữu ích trong việc xây dựng các ứng dụng Server – cái mà đáp ứng nhiều yêu cầu từ các Client.
Hạn chế:
Việc cài đặt chương trình theo kiểu đa tuyến phức tạp hơn. Đồng thời phải giải quyết vấn đề xung đột tài nguyên dùng chung. Việc cài đặt đa tuyến cũng sẽ tốn bộ nhớ hơn vì hệ thống phải lưu lại những thông tin về mỗi thread. Hơn nữa Processor phải mất nhiều thời gian hơn cho việc luân chuyển (switching) giữa các tuyến với nhau. Một vấn đề khác nữa là tình huống khóa chết – deadlock !
Đa tuyến trong .NET
MS.NET Framework cung cấp cho nhà phát triển cơ chế đa tuyến theo mô hình Free Threading. Việc tạo và quản lý tuyến được thực hiện thông qua lớp Thread, thuộc namespace là System.Threading.
Mô tả về lớp Thread:
Một số phương thức thường dùng
Một số thuộc tính public thường dùng:
Tạo một Thread trong VB.NET
Cú pháp tạo một tuyến trong VB.NET
ở trên là một ví dụ về : Một tiến trình có một Thread.
- Phân tích ví dụ trên:
- Một số câu hỏi:
Cho biết trình tự hiển thị các thông báo khi chạy chương trình sau đây:
Ví dụ 2: Tạo nhiều thread trong một tiến trình
Trong một chương trình (tiến trình) có thể tạo nhiều Thread, ví dụ:
Câu hỏi: Cho biết thứ tự thông báo sau đây ?
Một ví dụ khác:
Phương thức Join()
Theo mặc định, khi gọi phương thức Start của một thread thì câu lệnh ngay sau nó sẽ được thực thi mà không phụ thuộc vào việc thread đó đã kết thúc hay chưa. Như vậy, trong trường hợp nếu câu lệnh ngay sau lời gọi phương thức Start mà phụ thuộc vào kết quả thực thi của Thread (nói cách khác là ta muốn thread phải kết thúc trước khi làm câu lệnh sau Start) thì sẽ dẫn đến kết quả sai.
Ví dụ: Hiển thị các số từ 1 đến 10. Sau khi hiển thị xong thì thông báo "Đã xong !".
→ Rõ ràng là thông báo "Đã xong" chỉ được thực hiện sau khi Thread kết thúc.
Lưu ý: Phương thức Join chỉ được gọi nếu Thread đang ở trạng thái Running (Trước đó phải Start rồi). Có thể kiểm tra trạng thái của thread thông qua ThreadState.
Vấn đề xung đột trong cơ chế đa tuyến.
Trong ứng dụng windows Form, khi có nhiều Thread của ứng dụng truy cập ghi (write) đến điều khiển (Control) trên Form (tổng quát là truy cập đến Control toàn cục) thì .NET luôn cảnh báo với lỗi : "Cross-thread operation not valid…."
→ Giải quyết vấn đề này:
+ Nếu bạn thấy rằng việc truy cập đồng thời không gây ra những lỗi tiềm ẩn hay kết quả có thể xác định được thì bạn cứ dịch ra file Exe và chạy bình thường. Hoặc:
+ System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
+ Hoặc không Nhấn F5 (chế độ chạy có Debug) mà nhấn Ctrl-F5 (Không debug)
Ví dụ:
Tạo 2 thread, một thread TinhTong và một Thread TinhHieu của 2 số, kết quả hiển thị trên 2 Label tương ứng.
→ Rõ ràng hai thread này chỉ đọc giá trị trong textbox và ghi kết quả ra 2 label riêng biệt nên không có lỗi tiềm ẩn nào → ta không cần quan tâm đến cảnh báo của VS.NET.
Ý nghĩa : Tại một thời điểm chỉ cho phép một thread chạy đoạn lệnh (*) mà thôi. Điều này giúp ta tránh được các kết quả không theo ý muốn.
Ví dụ 2:
Viết 2 Thread, mỗi thread đều hiển thị kết quả trên cùng một textbox.
Kết quả khi có SyncLock
Một số ví dụ
Viết chương trình thể hiện 2 thanh tiến trình.
Viết chương trình mô phỏng đồng hồ điện tử
Chúc các bạn thành công. Mọi câu hỏi thắc mắc đến bài viết xin truy cập http://hoidap.laptrinhvb.net để được support.
ĐỪNG QUÊN LIKE AND SHARE NHA CÁC BẠN.
CÁM ƠN CÁC BẠN ĐÃ THEO DÕI.