Có vẻ như bạn là một người mới đến kỳ thú đang chờ đợi. Điều gì thực sự đã giúp tôi hiểu những gì async-await hiện là tương tự nhà hàng được đưa ra bởi Eric Lippert trong this interview. Tìm kiếm ở đâu đó ở giữa cho async đang chờ đợi.
Ở đây, ông mô tả rằng nếu một đầu bếp phải chờ đợi một cái gì đó, thay vì không làm gì, ông bắt đầu nhìn xung quanh để xem liệu ông có thể làm điều gì khác trong thời gian đó không.
Đồng hành chờ đợi không đồng bộ là tương tự. Thay vì chờ một tập tin được đọc, một truy vấn cơ sở dữ liệu để trả về, một trang web sẽ được tải xuống, chuỗi của bạn sẽ đi lên callstack để xem liệu có bất kỳ người gọi nào đang chờ và thực hiện các câu lệnh đó cho đến khi anh ta chờ đợi. Một khi anh ta thấy chờ đợi các chủ đề đi lên ngăn xếp cuộc gọi một lần nữa để xem nếu một trong những người gọi không chờ đợi vv Sau một thời gian khi tập tin được đọc, hoặc truy vấn được hoàn thành vv, các báo cáo sau khi chờ đợi được thực hiện.
Thông thường khi đọc danh sách lớn, chuỗi của bạn sẽ rất bận thay vì chờ đợi một cách nhàn rỗi. Nó không chắc chắn rằng đặt hàng một thread để làm những thứ sẽ cải thiện thời gian cần thiết để đọc danh sách của bạn. Cân nhắc đo cả hai phương pháp.
One reason to use async-await, even if it would lengthen the time needed to read the big list, would be to keep the caller (user interface?) responsive.
Để thực hiện chức năng async của bạn, bạn nên làm như sau:
và chờ đợi khi bạn cần kết quả.
private async Task<List<MyObject>> GetBigListAsync()
{
var myTask = Task.Run(() => GetBigList());
// your thread is free to do other useful stuff right nw
DoOtherUsefulStuff();
// after a while you need the result, await for myTask:
List<MyObject> result = await myTask;
// you can now use the results of loading:
ProcessResult(result);
return result;
}
Một lần nữa: nếu bạn không có gì hữu ích để làm trong khi các chủ đề khác đang tải danh sách (như giữ UI đáp ứng), không làm điều này, hoặc ít nhất là biện pháp nếu bạn được nhanh hơn.
bài viết khác đã giúp tôi hiểu async-chờ đã - Async await, bởi bao giờ nên hữu ích Stephen Cleary, - và một chút cao cấp hơn: Async-Wait best practices
mã ví dụ của bạn không hiển thị bất kỳ việc sử dụng một công tác trong phương thức GetBigList cũng không được đánh dấu là async, và điều đó có nghĩa là kết quả từ phương thức đó không thể được chờ đợi. –
thử Tác vụ không đồng bộ> GetBigList() –
Mate
Hãy nhớ rằng, chờ đợi không thực hiện thao tác đồng bộ thành một thao tác không đồng bộ. Đang chờ đăng ký phần còn lại của phương thức hiện tại như việc tiếp tục hoạt động không đồng bộ * đã tồn tại *. Đang chờ là về * quản lý không đồng bộ *, chứ không phải * tạo nó *. Nếu bạn muốn một hoạt động đồng bộ không đồng bộ, bạn sẽ phải tìm ra cách để thực hiện điều đó. –