Tôi không thấy sự khác biệt giữa các tính năng không đồng bộ mới của C# (và VB), và Task Parallel Library của .NET 4.0. Lấy ví dụ, Eric Lippert của mã from here:Tính năng không đồng bộ của C# 5.0 khác với TPL như thế nào?
async void ArchiveDocuments(List<Url> urls) {
Task archive = null;
for(int i = 0; i < urls.Count; ++i) {
var document = await FetchAsync(urls[i]);
if (archive != null)
await archive;
archive = ArchiveAsync(document);
}
}
Dường như từ khóa await
đang phục vụ hai mục đích khác nhau. Sự xuất hiện đầu tiên (FetchAsync
) có nghĩa là, "Nếu giá trị này được sử dụng sau trong phương thức và nhiệm vụ của nó chưa hoàn thành, hãy chờ cho đến khi nó hoàn tất trước khi tiếp tục." Ví dụ thứ hai (archive
) có nghĩa là, "Nếu tác vụ này chưa hoàn tất, hãy đợi ngay bây giờ cho đến khi hoàn thành." Nếu tôi sai, hãy sửa tôi.
Không thể dễ dàng viết như thế này?
void ArchiveDocuments(List<Url> urls) {
for(int i = 0; i < urls.Count; ++i) {
var document = FetchAsync(urls[i]); // removed await
if (archive != null)
archive.Wait(); // changed to .Wait()
archive = ArchiveAsync(document.Result); // added .Result
}
}
tôi đã thay thế await
đầu tiên với một Task.Result
trong đó giá trị thực sự là cần thiết, và lần thứ hai await
với Task.Wait()
, nơi chờ đợi là thực sự xảy ra. Chức năng là (1)
đã được triển khai và (2)
ngữ nghĩa gần hơn với những gì thực sự xảy ra trong mã.
Tôi nhận ra rằng phương pháp async
được viết lại dưới dạng máy trạng thái, tương tự như trình vòng lặp, nhưng tôi cũng không thấy những lợi ích mang lại. Bất kỳ mã nào yêu cầu một luồng khác để hoạt động (như tải xuống) sẽ vẫn yêu cầu một chuỗi khác và bất kỳ mã nào không (chẳng hạn như đọc từ một tệp) vẫn có thể sử dụng TPL để làm việc chỉ với một chuỗi duy nhất.
Tôi rõ ràng thiếu thứ gì đó rất lớn ở đây; ai có thể giúp tôi hiểu điều này tốt hơn một chút không?
Xem thêm http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworker ? lq = 1 và http://stackoverflow.com/questions/12414601/async-await-vs-backgroundworker?lq=1 – nawfal
Xem liên kết này có các ví dụ gọn gàng: http://richnewman.wordpress.com/2012/12/03/tutorial-asynchronous-programming-async-and-await-for-beginners/ – nawfal