Khi trải nghiệm async mới & Đang chờ các tính năng của 4.5 Tôi muốn xóa một số nhầm lẫn trước khi tiến xa hơn nữa. Tôi đã đọc bài viết khác nhau và cũng câu hỏi khác nhau về SO và nó giúp tôi thực hiện Async và Await hoạt động như thế nào. Tôi sẽ cố gắng đặt sự hiểu biết và sự nhầm lẫn của tôi ở đây và sẽ đánh giá cao nếu một người nào đó dạy tôi và những người khác đang tìm kiếm những thứ giống nhau. Tôi đang thảo luận điều này bằng những từ ngữ rất đơn giản.Async Await Few Confusions
Vì vậy, Async được sử dụng để trình biên dịch biết rằng phương thức được đánh dấu bằng Async chứa hoạt động Await (Hoạt động dài). Khung công tác mới nhất chứa các phương thức dựng sẵn mới cho các hoạt động Async.
Hàm dựng sẵn Không đồng bộ như kết nối.OpenAsync, ExecuteScalarAsync v.v. được sử dụng với Từ khóa chờ. Tôi không biết làm việc bên trong của những phương pháp Async này nhưng dự đoán mạnh mẽ của tôi là dưới mui xe họ đang sử dụng Nhiệm vụ.
Tôi có thể đặt quy tắc này là quy tắc chung mà Await sẽ có với bất kỳ phương pháp nào triển khai Tác vụ hay không. Vì vậy, nếu tôi cần phải tạo ra phương pháp riêng của tôi đó là thực hiện hoạt động lâu sau đó tôi sẽ tạo ra nó như là nhiệm vụ và khi nó được gọi là tôi sẽ sử dụng Await từ khoá với nó?
Điều quan trọng thứ hai là quy tắc ngón tay cái của việc tạo phương thức là Không đồng bộ hoặc tạo nó làm nhiệm vụ. Ví dụ:
public void SampleMain()
{
for (int i = 1; i <= 100; i++)
{
DataTable dt = ReadData(int id);
}
}
public DataTable ReadData(int id)
{
DataTable resultDT = new DataTable();
DataTable dt1 = new DataTable();
// Do Operation to Fill DataTable from first connection string
adapter.Fill(dt1);
DataTable dt2 = new DataTable();
// Do Operation to Fill DataTable from first connection string
adapter.Fill(dt2);
// Code for combining datatable and returning the resulting datatable
// Combine DataTables
return resultDT;
}
public string GetPrimaryConnectionString()
{
// Retrieve connection string from some file io operations
return "some primary connection string";
}
public string GetSecondaryConnectionString()
{
// Retrieve connection string from some file io operations
return "some secondaryconnection string";
}
Đây là một trường hợp rất đơn giản mà tôi đã tạo dựa trên một số ứng dụng thực tế mà tôi đã làm trước đây. Vì vậy, tôi đã chỉ tự hỏi làm thế nào để làm cho toàn bộ quá trình này Async.
Tôi có nên đặt GetPrimaryConnectionString và GetSecondaryConnectionString thành Công việc và đợi chúng trong ReadData không. ReadData cũng sẽ là một nhiệm vụ? Làm thế nào để gọi ReadData trong chức năng SampleMain?
Một cách khác có thể là tạo Tác vụ cho ReadData trong SampleMain và chạy Tác vụ đó và bỏ qua chuyển đổi các phương thức khác làm Tác vụ. Đây có phải là cách tiếp cận tốt không? Nó sẽ thực sự không đồng bộ?
Mẫu ý bạn là "tạo phương thức làm nhiệm vụ" sẽ hữu ích hơn so với mã đồng bộ ngẫu nhiên một phần mà bạn đã thêm vào bài đăng. –
@Alexei Levenkov Cảm ơn bạn đã trả lời. Tôi hoàn toàn không hiểu bình luận của bạn. Những gì tôi đã trình bày là một kịch bản nguyên mẫu với ít mã nhất có thể để làm cho độc giả hiểu cách làm cho toàn bộ quá trình này là Không đồng bộ bằng cách sử dụng Async và Await. Nó không phải là ngẫu nhiên cả. –
@ M.kazem Akhgary. Ổn thỏa. Vì vậy, không cần phải thay đổi phương thức GetPrimaryConnectionString và GetSecondaryConenctionString. Nếu tôi chỉ làm cho ReadData là Async thì tất cả quy trình này sẽ là Không đồng bộ? –