2012-10-22 25 views
6

Tôi rất hào hứng khi tạo ứng dụng đầu tiên của mình với C# 5.0 và tôi muốn sử dụng các từ khóa không đồng bộ/chờ đợi để giảm bớt các cơn phiền toái của các cuộc gọi dữ liệu không đồng bộ.Việc thiếu từ khóa không đồng bộ trong các giao diện có phá vỡ DI trong C# 5.0 không?

Tôi hơi bối rối khi giao diện không cho phép từ khóa async là một phần của hợp đồng, vì từ khóa chờ đợi chỉ hoạt động cho các phương thức được đánh dấu không đồng bộ. Điều này có nghĩa là không thể gọi các phương thức không đồng bộ thông qua các tham chiếu giao diện. Điều này cũng đi cho các phương pháp trừu tượng. Am i thiếu cái gì ở đây? Điều này có nghĩa rằng thường xuyên DI-công cụ của tôi sẽ không còn làm việc:

IAsyncRepository<T> { 
Task<IList<T>> GetAsync(); // no 'async' allowed 
} 

abstract class AsyncRepositoryBase<T> { 
public abstract Task<IList<T>> GetAsync(); // no 'async' allowed 

// mã khách hàng:

IAsyncRepository<Model> repo = ioc.Resolve<IAsyncRepository<Model>>(); 
var items = await repo.GetAsync(); // DOOOOOH, will not compile! 

Đây là giải pháp hiện tại của tôi:

public abstract class AsyncRepositoryBase<T> 
{ 
    protected Task<IList<T>> _fetcherTask; 

    protected AsyncRepositoryBase(Task<IList<T>> fetcherTask) 
    { 
     _fetcherTask = fetcherTask; 
    } 

    public virtual async Task<IList<T>> GetASync() 
    { 
     return await _fetcherTask; 
    } 
} 

Tôi có phải chọn giữa trừu tượng và tính năng langauge? Vui lòng cho tôi biết tôi đang thiếu thứ gì đó.

+0

Bất kỳ sự trừu tượng nào bị rò rỉ theo cách này hay cách khác. Nhưng nó không phải là một vấn đề, bạn chỉ phải cung cấp một cách để thực hiện các mô hình async. Trả lại IAsyncResult là đủ. –

Trả lời

7

await keyword only works for async marked methods

Có vấn đề của bạn. Trong khi await phải là bên trong phương thức async, nó có thể chờ đợi trên bất kỳ tác vụ nào, cho dù được triển khai qua async hay không.

Ví dụ:

interface IFoo { 
    Task BarAsync(); 
} 

class Foo : IFoo { 
    public async Task BarAsync() { 
     // Implemented via async/await in this case. 
     // You could also have implemented it without async/await. 
    } 
} 

// ... 

async void Test() { 
    IFoo foo = ... ; 
    await foo.BarAsync(); // Works no matter how BarAsync is implemented. 
} 

Đối với lỗi cú pháp của bạn: await repo.GetAsync(); // DOOOOOH, will not compile! - cậu quên để đánh dấu phương pháp có chứa đoạn mã này như async (bạn không cần phải đánh dấu IAsyncRepository.GetAsync như async)?

+0

Cảm ơn, đây là những gì tôi đã có, nhưng tôi đã nhận lỗi trình biên dịch trên đó. Viết lại nó, và bây giờ tôi không gặp lỗi gì cả. Dunno nếu nó là của tôi hoặc trình biên dịch, tôi sẽ đổ lỗi cho trình biên dịch và đi ngủ. Cảm ơn :) – tuxbear

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