Cho một phương pháp nhưchờ đợi vs Unwrap()
public async Task<Task> ActionAsync()
{
...
}
sự khác biệt giữa
await await ActionAsync();
và
await ActionAsync().Unwrap();
nếu có là gì.
Cho một phương pháp nhưchờ đợi vs Unwrap()
public async Task<Task> ActionAsync()
{
...
}
sự khác biệt giữa
await await ActionAsync();
và
await ActionAsync().Unwrap();
nếu có là gì.
Unwrap()
tạo phiên bản nhiệm vụ mới đại diện cho toàn bộ hoạt động trên mỗi cuộc gọi. Ngược lại với tác vụ await
được tạo theo cách như vậy khác với tác vụ bên trong ban đầu. Xem Unwrap() tài liệu, và xem xét đoạn mã sau:
private async static Task Foo()
{
Task<Task<int>> barMarker = Bar();
Task<int> awaitedMarker = await barMarker;
Task<int> unwrappedMarker = barMarker.Unwrap();
Console.WriteLine(Object.ReferenceEquals(originalMarker, awaitedMarker));
Console.WriteLine(Object.ReferenceEquals(originalMarker, unwrappedMarker));
}
private static Task<int> originalMarker;
private static Task<Task<int>> Bar()
{
originalMarker = Task.Run(() => 1);;
return originalMarker.ContinueWith((m) => m);
}
Output là:
True
False
Cập nhật với điểm chuẩn cho NET 4.5.1: Tôi đã thử nghiệm cả hai phiên bản, và nó chỉ ra rằng phiên bản với đôi await
là tốt hơn về việc sử dụng bộ nhớ. Tôi đã sử dụng trình thu thập bộ nhớ Visual Studio 2013. Kiểm tra bao gồm 100000 cuộc gọi của mỗi phiên bản.
x64:
╔══════════════════╦═══════════════════════╦═════════════════╗
║ Version ║ Inclusive Allocations ║ Inclusive Bytes ║
╠══════════════════╬═══════════════════════╬═════════════════╣
║ await await ║ 761 ║ 30568 ║
║ await + Unwrap() ║ 100633 ║ 8025408 ║
╚══════════════════╩═══════════════════════╩═════════════════╝
x86:
╔══════════════════╦═══════════════════════╦═════════════════╗
║ Version ║ Inclusive Allocations ║ Inclusive Bytes ║
╠══════════════════╬═══════════════════════╬═════════════════╣
║ await await ║ 683 ║ 16943 ║
║ await + Unwrap() ║ 100481 ║ 4809732 ║
╚══════════════════╩═══════════════════════╩═════════════════╝
Tôi thực sự đánh giá cao câu trả lời chi tiết, mẫu mã và thậm chí cả điểm chuẩn! Rất tuyệt vời. – hatcyl
Sẽ không có bất kỳ sự khác biệt chức năng nào.
cảm ơn bạn đã xác nhận, tôi sẽ chấp nhận sớm. Trong khi chờ đợi, bất kỳ tài liệu tham khảo cho tuyên bố này? – hatcyl
@hatcyl Bạn cần tham khảo gì? 'await' unwraps một nhiệm vụ. Đó là * những gì nó *. Chúng bằng * theo định nghĩa *. – Servy
@hatcyl 'Unwrap' trả về một nhiệm vụ mới đại diện cho nhiệm vụ bên trong của' Task
'chờ ActionAsync() Unwrap(); 'chắc chắn là dễ dàng hơn để đọc giữa hai người.. Đó là nơi mà sự khác biệt kết thúc. –
Thêm điểm chuẩn vào asnwer của tôi. –