6

C#5.0 で最初のアプリを作成することに興奮し、async/await キーワードを使用して非同期データ呼び出しの問題を軽減したいと考えました。

await キーワードは async マークされたメソッドに対してのみ機能するため、インターフェイスが async キーワードをコントラクトの一部にすることを許可していないことに少し困惑しています。これは、インターフェイス参照を介して非同期メソッドを呼び出すことができないことを意味します。これは抽象メソッドにも当てはまります。ここで何か不足していますか?これは、私の通常の 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;
    }
}

抽象化と言語機能のどちらかを選択する必要がありますか? 何か足りないと教えてください。

4

1 に答える 1

7

await キーワードは、非同期でマークされたメソッドに対してのみ機能します

問題があります。メソッド内にあるawait必要がありますが、実装されているかどうかに関係なく、任意のタスクを待機できます。asyncasync

例えば:

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!- このコードを含むメソッドを as とマークするのを忘れましたか( asasyncとマークする必要はありません)?IAsyncRepository.GetAsyncasync

于 2012-10-22T23:58:52.133 に答える