2016-01-15 23 views
7

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(); 

await ActionAsync().Unwrap(); 

nếu có là gì.

+1

'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. –

+1

Thêm điểm chuẩn vào asnwer của tôi. –

Trả lời

15

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   ║ 
╚══════════════════╩═══════════════════════╩═════════════════╝ 
+0

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

4

Sẽ không có bất kỳ sự khác biệt chức năng nào.

+0

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

+1

@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

+0

@hatcyl 'Unwrap' trả về một nhiệm vụ mới đại diện cho nhiệm vụ bên trong của' Task '. Nó sẽ có thể trả lại một nhiệm vụ như vậy ngay lập tức; nó sẽ không phải là một hoạt động chặn. Nếu các nhiệm vụ được trả về bởi hoặc là không giống nhau, thì nó sẽ là một lỗi trong một trong hai quy trình. – Servy

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