IV. Chỉ tiết thiết kế, mô tả hoạt động.
(xem hình trên), để thể hiện cho người đùng biết được quá trình hoạt động của
BackgroundWorker đang làm gì và chừng nào thì kết thúc. Tuy đơn giản hóa công việc lập trình đa luồng đi rất nhiều, nhưng khi sử dụng BackgroundWorker cũng không tránh khỏi một số khó khăn đặc trưng của việc lập trình luồng, sẽ đề cập chỉ tiết sau.
b. Synchronous socket programming
Để send dữ liệu qua mạng chúng ta phải quản lý được kết nối giữa hai máy. NET mô hình hóa kết nối này thông qua đối tượng socket. Một socket bao gồm hai
IPEndPoint, hai đối tượng IPEndPoint này lần lượt chứa thông tin về IP, port của máy chủ và IP, Port của máy khách — nhưng thành phần đại diện cho một kết nối. Việc gửi và nhận dữ liệu được thực hiện thông qua hai Phương thức có sẵn của socket là
Socket.SendQ và Socket.Receive()
Đối tượng socket trong .NET hỗ trợ nhiều giao thức transport khác nhau như
TCP, IPX, UDP v.v... Do không có nhiều yêu cầu đặt biệt về giao thức transport nền cho chương trình nên em chọn sử dụng giao thức TCP phổ biến có sẵn khả năng checksum tương đối.
Ở đây để đơn giản hóa những công việc liên quan nhiều đến network và kiến
thức mạng máy tính. em chọn lập trình socket đồng bộ, tức là mỗi khi gọi phương
thức Socket.Send() hoặc Socket.Receive(), chương trình sẽ bị khóa (block) cho đến khi dữ liệu được gửi/nhận thành công. Cách này có thể hạn chế tình trạng máy bị tràn ngập bởi tín hiệu gửi đến từ các máy khác, nhất là trong trường hợp một máy khi chia sẻ file phải kết nối với nhiều máy, mỗi máy lại có nhiều socket khác nhau. Tuy nhiên synchronous socket đôi khi khiến chương trình bị treo, đòi hỏi phải áp dụng thêm kỹ thuật lập trình đa luồng trong việc quản lý và sử đụng các socket này.
c. Thread synchronization
Việc trang bị khả năng đa luồng cho phép chương trình tận dụng tốt tài nguyên hệ thống, đảm bảo vẫn đáp ứng (responsiveness) ngay cả khi đang phải thực hiện những công việc nặng. Đổi lại, chương trình trở nên cực kỳ phức tạp so với ứng dụng