2012-01-24 30 views
5

Sử dụng TPL với .NET 4, tôi đang cố gắng quyết định cách thiết kế các API xử lý tương lai. Một khả năng đã xảy ra với tôi là để bắt chước mô hình async nhưng không có một phương pháp End(IAsyncResult):Thành ngữ TPL này có tồn tại không?

public Task<int> BeginGetAge() 
{ 
    // create and return task 
} 

public int GetAge() 
{ 
    return this.BeginGetAge().Result; 
} 

Như vậy, người gọi có thể quyết định xem có nên gọi hoặc chặn non-blocking phiên bản của GetAge(). Hơn nữa, họ có quyền truy cập vào tương lai để có thể xây dựng tiếp tục trên đầu trang của nó etcetera.

Thành ngữ này có hợp lệ không? Có bất kỳ hạn chế rõ ràng hoặc các vấn đề mà tôi đang thiếu? Liệu nó có lẽ thậm chí có một tên chính thức?

+0

Trường hợp thứ hai của bạn sẽ được hưởng lợi rất nhiều từ 'chờ đợi' tôi tin tưởng. – user7116

+0

FYI, Stephen Toub đã đăng về điều này (cung cấp trình bao bọc đồng bộ hóa cho các phương thức không đồng bộ) - tl; dr tránh nó :) xem http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638. aspx và cũng http://blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx –

Trả lời

3

Trả lại Task là cách thức không đồng bộ C# 5 mới - được gọi là TAP: Task-based Asynchronous Pattern.

Sự khác biệt duy nhất là phương thức được đặt tên là GetAgeAsync.

Vì vậy, có - phương pháp này được khuyến nghị vì nó sẽ giúp bạn dễ dàng chuyển sang C# 5 không đồng bộ khi được phát hành.

+0

Tham khảo rất hữu ích - cảm ơn. –

2

Thành ngữ này có vẻ hoàn toàn hợp lệ với tôi và thực sự hỗ trợ cho Task dựa trên sự không đồng bộ sẽ là một tính năng lớn trong các phiên bản sắp tới của .Net.

Tuy nhiên, tôi sẽ thay đổi cách triển khai của bạn để phương pháp chặn GetAge không gọi phương thức async và sau đó đợi - phí trên (có khả năng) tạo chuỗi mới là không cần thiết.

+0

Có thể trao đổi mối quan hệ giữa các phương thức và có 'BeginGetAge()' return 'Task .Factory.StartNew (() => GetAge())'. –

+0

@SeanU Chính xác. –

+1

Vâng, tôi không nghĩ rằng nó sẽ tạo ra một chủ đề mới nhiều như bối cảnh chuyển đổi cho một chủ đề hiện có. Và thậm chí sau đó, nó lên đến lịch trình để quyết định xem điều này là cần thiết. Nhưng tôi lấy ý kiến ​​của bạn và đề xuất của Sean có ý nghĩa. –

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