Tôi đã nghiên cứu tính thực tiễn của một số tính năng song song mới trong .Net 4.0.Các tính năng song song trong .Net 4.0
Nói rằng tôi có mã như vậy:
foreach (var item in myEnumerable)
myDatabase.Insert(item.ConvertToDatabase());
Imagine myDatabase.Insert đang thực hiện một số công việc để chèn vào một cơ sở dữ liệu SQL.
Về mặt lý thuyết bạn có thể viết:
Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));
Và tự động bạn sẽ có được mã mà lợi dụng đa lõi.
Nhưng nếu myEnumerable chỉ có thể tương tác với một chuỗi đơn lẻ thì sao? Liệu lớp Parallel liệt kê bởi một luồng đơn và chỉ gửi kết quả đến các luồng công nhân trong vòng lặp?
Nếu myDatabase chỉ có thể tương tác với một chuỗi đơn lẻ thì sao? Nó chắc chắn sẽ không tốt hơn nếu tạo kết nối cơ sở dữ liệu cho mỗi lần lặp của vòng lặp.
Cuối cùng, điều gì xảy ra nếu "mục var" của tôi xảy ra là UserControl hoặc nội dung nào đó phải tương tác với chuỗi giao diện người dùng?
Tôi nên làm theo mẫu thiết kế nào để giải quyết những vấn đề này?
Nó đang tìm kiếm với tôi rằng chuyển sang Parallel/PLinq/etc là không chính xác dễ dàng khi bạn đang đối phó với các ứng dụng trong thế giới thực.
Câu trả lời tốt nhất cho đến nay, câu hỏi phụ mặc dù: nói vòng lặp cơ thể của tôi thực hiện một hoạt động IO chạy dài (yêu cầu mạng, cơ sở dữ liệu, vv), sẽ lớp Parallel phát hiện ngủ/treo chủ đề và tự động bắt đầu một cái mới? Hay nó sẽ bị giới hạn số lượng lõi trên máy? – jonathanpeppers
@ Jonathan.Peppers: Trình lên lịch tác vụ mặc định xử lý việc này khá tốt. Nó sẽ tiêm thêm công việc vào tình huống. (Theo mặc định, ThreadPool sử dụng nhiều phần tử hơn chủ đề và quy mô trở lại dựa trên khối lượng công việc động) –