2014-08-28 14 views
12

Với đoạn mã sau, tôi có một số câu hỏi về thực hành tốt nhất:Thực hành tốt nhất để điền vào một DataSet hoặc DataTable không đồng bộ trong ASP.NET là gì?

string connectionString = @"Server=(local)\sqlexpress; Database=master; Integrated Security=true;"; 

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    using (SqlDataAdapter dataAdapter = new SqlDataAdapter("select * from information_schema.columns", connection)) 
    { 
     await connection.OpenAsync(); 

     DataTable dataTable = new DataTable(); 
     await Task.Run(() => dataAdapter.Fill(dataTable)); 
     return dataTable; 
    } 
} 

Tôi đã nhìn thấy một số ví dụ mà bọc toàn bộ khối mã trong một Task.Run() cuộc gọi, nhưng tôi không chắc chắn nếu đó là tốt hơn so với gọi Task.Run() chỉ cho các DataAdapter.Fill() phương pháp, mà cảm thấy linh hoạt hơn và cụ thể (chỉ sử dụng đang chờ đợi trên các nhiệm vụ async).

Cách tiếp cận gọi Task.Run() trên phương thức Fill() có tốt hơn là gói toàn bộ khối mã không?

Có bất kỳ tác dụng phụ tiêu cực nào để gọi Fill() trong Task.Run() không? Tôi đang suy nghĩ về một cái gì đó dọc theo dòng mất cuộc gọi ngăn xếp và/hoặc thông tin ngoại lệ nếu Fill() có một lỗi.

Có cách nào tốt hơn để viết điều này trong ASP.NET không?

+1

Tại sao không đặt * tất cả * của mã đó bên trong một phương thức không đồng bộ? Tức là, di chuyển Nhiệm vụ để bao gồm toàn bộ vòng đời kết nối SQL bao gồm điền vào DataTable. – user2864740

+1

Đây có phải là ASP.NET hoặc GUI không? – usr

+0

@usr, tôi đã giả sử ASP.NET; Có sự khác biệt lớn ở đây không? –

Trả lời

1

Trong ASP.NET nó hầu như không bao giờ giúp sử dụng Task.Run. Chính xác nó sẽ cải thiện điều gì? Nó chỉ giới thiệu trên không.

Điều đó nói rằng, Fill sẽ thực hiện IO (tháo đầu đọc dữ liệu) để bạn có thể muốn gọi nó không đồng bộ. Thật không may, không có phiên bản async của phương pháp này.

Nếu bạn nhấn mạnh vào việc sử dụng IO không đồng bộ (which is questionable for database access), bạn cần phải tìm giải pháp thay thế. Có thể async Entity Framework hoặc ADO.NET thô có thể giúp bạn.

0

Bạn đã thử sử dụng Trình quản lý dữ liệu và ExecuteReaderAsync mới chưa? Những gì tôi nhớ là SqlDataAdapter đã sử dụng một DataReader nội bộ mà không có async. Bạn cũng có thể muốn bỏ qua bằng cách sử dụng một DataTable hoàn toàn nếu có thể cắt giảm một số chi phí.

Đối với các bộ kết quả nhỏ, rất hiếm khi thay đổi các cột lược đồ truy vấn như vậy, tôi có thể sẽ lưu nó vào máy chủ web theo một trong nhiều cách. Heck, để thay đổi giản đồ, bạn thậm chí có thể tạo một kích hoạt DDL đơn giản để cập nhật một bảng hàng đơn với một trường dấu thời gian để cho bạn biết một thay đổi đã được thực hiện, sau đó chỉ chạy truy vấn khi cần thiết. Một tùy chọn khác là CHECKSUM_AGG cho các bảng không phải là các bảng lược đồ.

Các vấn đề liên quan