2017-12-03 35 views
5

Với một phương pháp async:Chuỗi cuộc gọi cho async/await ... đang chờ đợi sự chờ đợi hoặc trả lại những gì đang chờ đợi?

public async Task<int> InnerAsync() 
{ 
    await Task.Delay(1000); 
    return 123; 
} 

Và gọi đó là thông qua một phương pháp trung gian, phương pháp trung gian nên chờ đợi các phương pháp async (IntermediateA) hoặc chỉ đơn thuần là trả lại Task (IntermediateB)?

pubic async Task<int> IntermediateA() 
{ 
    return await InnerAsync(); 
} 

private Task<int> IntermediateB() 
{ 
    return InnerAsync(); 
} 

Như tốt nhất tôi có thể nói với các chương trình gỡ rối, cả hai xuất hiện để làm việc giống hệt nhau, nhưng có vẻ như với tôi rằng IntermediateB nên thực hiện tốt hơn bằng cách tránh một entry chờ đợi ở những máy nhà nước.

Đúng không?

+3

Sự khác biệt là trong xử lý ngoại lệ. Để hiểu rằng tốt hơn tôi đề nghị bạn thử ném một ngoại lệ từ hàm bên trong và xem cách mọi thứ hoạt động. –

+0

Cảm ơn bạn. Tôi đã không xem xét xử lý ngoại lệ ở tất cả. – MikeZ

+0

"có vẻ như với tôi rằng IntermediateB nên thực hiện tốt hơn" - có, nhưng sự khác biệt sẽ là một vài nano giây. Nó cũng có thể tiết kiệm một vài chục byte trong nhị phân được tạo ra. –

Trả lời

6

Có sự khác biệt tinh tế trong hai phương pháp này. Nếu bạn await nhiệm vụ thất bại ngoại lệ sẽ được ném vào phương pháp đó, nhưng nếu bạn vượt qua nhiệm vụ nghĩ rằng phương pháp và sau đó await nó, ngoại lệ sẽ được ném vào phương pháp tiêu dùng. Một sự khác biệt là hiếm hơn, trong trường hợp người tiêu dùng chờ đợi nhiệm vụ và nếu nó xảy ra với sự chậm trễ, nhiệm vụ có thể được hoàn thành tại điểm chờ đợi và bỏ qua máy nhà nước.

+0

Cảm ơn bạn. Tôi đã không xem xét xử lý ngoại lệ ở tất cả. – MikeZ

+0

Điều gì về hiệu suất? Đây không phải là tạo ra hai máy nhà nước (đang chờ bên trong)? – Mardoxx

+0

Nếu không có thử/nắm bắt, ngoại lệ sẽ tuyên truyền cho người gọi. Bạn có thể chỉ ra một sự khác biệt thực tế đáng kể? –

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