2012-10-22 3 views
6

私はC#5.0で初めてのアプリケーションを作成することに興奮していました。私はasync/awaitキーワードを使用して、非同期データ呼び出しの苦労を緩和しました。インターフェイスでasyncキーワードが不足しているため、C#5.0のDIが壊れていませんか?

awaitキーワードは非同期マークされたメソッドに対してのみ機能するため、インターフェイスでは非同期キーワードを契約の一部にすることはできません。これは、インタフェース参照を通じて非同期メソッドを呼び出すことは不可能であることを意味します。これは抽象メソッドにも適用されます。私はここに何かを逃していますかこれは私の通常のDI-ものが機能しなくなることを意味します:

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

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

//クライアントコード:

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

これは私の現在のソリューションです:

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; 
    } 
} 

は私がする必要があります抽象化とランゲージ機能のどちらかを選択しますか?私に何かが足りないと教えてください。

+0

いずれかの抽象化は、いずれかの方法で漏洩します。しかし、それは問題ではありません。非同期パターンを実装する方法を提供するだけです。 IAsyncResultを返すだけで十分です。 –

答えて

7

await keyword only works for async marked methods

問題があります。 await内部async方法でなければならないが、それはasyncかを介しを実施しているか、いずれかのタスクを待つことができます。例えば

:あなたの構文エラーについては

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. 
} 

await repo.GetAsync(); // DOOOOOH, will not compile! - あなたは(あなたがasyncとしてIAsyncRepository.GetAsyncをマークする必要はありません)asyncように、コードのこの部分を含むメソッドをマークすることを忘れたのか?

+0

ありがとう、これは私が持っていたものですが、私はそれにコンパイラのエラーがあります。それを書き直してみると、今は何の誤りもありません。私がコンパイラであればDunnoだったので、コンパイラを責めて寝る。ありがとう:) – tuxbear

関連する問題