2012-04-20 43 views
5

Đây là mã hiện tại của tôi mà tiết kiệm một số dữ liệu vào nhiều bảngSqlConnection với lập trình song song

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    DoWork1(conn); 
    DoWork2(conc); 
    DoWork3(conn); 
} 

Để tăng tốc độ mã của tôi lên để tôi cố gắng để có được sự ủng hộ TPL .net và tôi rehanged mã của tôi như sau

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    ParallelOptions pw = new ParallelOptions(); 
    pw.MaxDegreeOfParallelism = Environment.ProcessorCount; 

    Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn)); 
} 

Nhưng điều này sẽ ném cho tôi một lỗi ngoại lệ lỗi kết nối nội bộ từ phương thức ExecuteNonQuery() trong lớp truy cập dữ liệu của tôi.Phương pháp song song của tôi có sai không?

+0

"Cách tiếp cận song song của tôi có sai không?" - hoàn toàn có thể. –

Trả lời

8

Vâng, có nhiều cách có thể có khả năng được thực hiện để hoạt động bằng cách sử dụng MARS - nhưng tôi sẽ đề xuất một cách tiếp cận khác. (Tôi không biết liệu MARS có hỗ trợ sử dụng cùng một kết nối trên nhiều luồng, mặc dù nó cho phép nhiều hoạt động đồng thời.)

Thay vì cố gắng sử dụng lại một kết nối trong tất cả các tác vụ song song, hãy thực hiện từng công việc) một kết nối cho chính nó, và để cho kết nối tổng hợp xử lý mặt hiệu quả của điều đó. Đó là thực hành chung tốt nhất trong .NET dù bạn đang sử dụng song song hay không: mở kết nối, thực hiện một số công việc, đóng kết nối.

+0

cảm ơn bạn đã phản hồi nhanh chóng của bạn. Tôi sẽ thử phương pháp thứ hai. (Mở và đóng kết nối một lần cho mỗi hoạt động) – Renushi