Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Cải thiện hiệu suất lập trình bất đồng bộ
E chào các a/c. Em có bài toán như sau, a/c nào đã có kinh nghiệm về lập trình bất đồng bộ trên C# hỗ trợ em với ạ.
Từ khi .NET 4.5 ra đời hỗ trợ viết code bất đồng bộ đơn giản hơn việc quản lý các Thread. Bài toán thực tế, khi làm việc ảnh hưởng đến hiệu suất phần mềm/ứng dụng như sau.
- Môi trường phát triển: .NET 4.7 WPF
- Lấy nội dung từ một website (Web crawler) để hiện thị lên DataGrid. Ta có một danh sách 3000 số điện thoại, mỗi lần request sẽ tra thông tin khách hàng, và đổ dữ liệu động về DataGrid.
- Kết nối đến server sử dụng lớp TcpClient (đã thử thêm với lớp WebRequest).
Trên thực tế, khi lập trình bất đồng bộ Asynchronous để giúp form Responsive (không bị Blocked UI - đơ form), vẫn có thể thực hiện các công việc khác trong khi vẫn đổ dữ liệu về.
Phần mềm sẽ chạy danh sách tuần tự serial từ 1 cho đến 3000. Tuy nhiên, nó chỉ chạy trên một ThreadID duy nhất, khoảng 200 bản ghi đầu kết quả tra cứu rất nhanh (1s tra cứu được 1 số đt), nhưng tốc độ response từ khoảng 200-300 về sau càng chậm dần (3-4s tra cứu được 1 số đt).
- Để cải thiện hiệu suất. Em có tìm hiểu qua lập trình song song sử dụng Parallel (TAP - Task Async Parallel), nó chạy trên nhiều Thread khác, tuy nhiên, có request trả về kết quả, có request ko có thông tin response. Chạy khoảng được 200-300 ds đầu, nó bắt đầu văng ra lỗi Connection Time-out. Có thể do mình gửi nhiều request đến máy chủ cùng lúc, nó ko response được ngay. Vậy anh/chị nào có kinh nghiệm về lập trinh bất đồng bộ hỗ trợ em với.
1. Cải thiện hiệu suất ứng dụng: tăng tốc thời gian tra cứu
2. Đảm bảo form vẫn responsive không bị Blocked UI.
3. Dữ liệu lấy về mỗi request sẽ hiển thị động trên DataGrid (vd: dgResult.Item.Add(subscribers) - trong đó: subscribers thể hiện của lớp có các Properties)
4. Hoặc chạy trên nhiều Thread nhưng vẫn đảm bảo vẫn giữ Keep-Alive ko bị Connection Time-out
5. Ngoài ra, trong bộ .NET 4.5 mới hỗ trợ lớp HttpClient là một thư viện mới, làm việc tốt hơn so với sử dụng WebRequest. Ai có kinh nghiệm về cái này hỗ trợ em với ạ.
6. Em không muốn sử dụng lập trình Muti-Thread vì quản lý nó rất cực (mặc dù đã có Thread-Pool hỗ trợ tốt hơn). Tuy nhiên em vẫn thích sử dụng async/await
Trân trọng cảm ơn cả nhà.
Chưa rõ kiến trúc cái bạn muốn làm, những policy trên server, quá ít thông tin!