Tôi có một giao diệnCách triển khai phương thức giao diện trả về tác vụ <T>?
interface IFoo
{
Task<Bar> CreateBarAsync();
}
Có hai phương pháp để tạo ra Bar
, một không đồng bộ và một đồng bộ. Tôi muốn cung cấp một giao diện thực hiện cho mỗi một trong hai phương pháp này.
Đối với phương pháp không đồng bộ, việc thực hiện có thể nhìn như thế này:
class Foo1 : IFoo
{
async Task<Bar> CreateBarAsync()
{
return await AsynchronousBarCreatorAsync();
}
}
Nhưng CÁCH tôi nên thực hiện các lớp Foo2
mà sử dụng đồng bộ phương pháp để tạo Bar
?
tôi thể thực hiện các phương pháp để chạy đồng bộ:
async Task<Bar> CreateBarAsync()
{
return SynchronousBarCreator();
}
thì Trình biên dịch sẽ cảnh báo chống lại bằng async
trong phương pháp chữ ký:
async này thiếu 'await' khai thác và sẽ chạy đồng bộ. Xem xét sử dụng toán tử 'await' để đợi các cuộc gọi API không chặn hoặc 'đang chờ Task.Run (...)' để thực hiện công việc liên kết CPU trên một chuỗi nền.
Hoặc, tôi có thể thực hiện phương thức để trả lại rõ ràng Task<Bar>
. Theo ý kiến của tôi, mã sẽ trông ít có thể đọc được:
Task<Bar> CreateBarAsync()
{
return Task.Run(() => SynchronousBarCreator());
}
Từ quan điểm hiệu năng, tôi cho rằng cả hai phương pháp đều có cùng chi phí, hoặc?
Tôi nên chọn phương pháp nào; thực hiện phương thức async
đồng bộ hoặc kết nối rõ ràng cuộc gọi phương thức đồng bộ trong Task
?
EDIT
Dự án tôi đang làm việc trên thực sự là một dự án 4 NET với async/chờ phần mở rộng từ gói Microsoft Async NuGet. Trên .NET 4, Task.Run
sau đó có thể được thay thế bằng TaskEx.Run
. Tôi đã sử dụng phương thức .NET 4.5 một cách có ý thức trong ví dụ trên với hy vọng làm cho câu hỏi chính rõ ràng hơn.
Trong trường hợp này, tôi tin 'Task.FromResult (SynchronousBarCreator())' là tốt hơn 'Task.Run (...)' vì nó không thực sự lên lịch và chạy một tác vụ để có được kết quả. –
Có phải 'SynchronousBarCreator' chạy dài không? Có phải CPU bị ràng buộc, hay nó dành thời gian chờ đợi cái gì khác? – CodesInChaos
Trong trường hợp tôi đang làm việc ngay bây giờ, nó là * không * chạy dài. Nhưng nó có thể là trong các kịch bản sắp tới. –