2016-07-01 18 views
2

...私は実装に関してスティックの間違った終わりを取得することができる感覚を持っているタスクを待つことはできません<MyObject>私は次のコードは、「待つことはできません」というエラーを投げ続ける理由を把握することができません

非同期APIアクションです。誰かが私が間違っているところで私を指示することはできますか?

APIアクション:

[HttpGet] 
public async Task<IHttpActionResult> Get(int id) 
{ 
    var getAnimal = animalManager.Get(id); 

    var animal = await getAnimal; 

    return Ok(animal); 
} 

マネージャー/サービス方法:

public async Task<Animal> Get(int id) 
{ 
    return await Task.Run(() => { return animalRepository.Get(id); });  
} 

リポジトリ方式(同期):

public Animal Get(int id) 
{ 
    var animal = dbSet.Find(id); 

    if (animal == null) 
    { 
     throw new ArgumentNullException("Animal"); 
    } 

    return animal; 
} 
+1

サービスメソッド(または任意の 'async'メソッドには' Async'サフィックスがあるので、 'GetAsync'という名前にしてください) –

+2

' await'ではこのエラーが発生します。あなたが結果を見つけられなかった場合、 'ArgumentNullException'が間違ったエラーと思われることを除いて、最初はすべて見えるでしょう。 –

+1

コンパイル時または実行時のエラーですか? ' FindAsync() 'というDbSetの非同期バージョンを使用しようとしましたか? ? – pwas

答えて

1

dbSet.Findの代わりにdbSet.FindAsyncを使用してください。次のことを考えてみましょう:

レポ

public Task<Animal> GetAsync(int id) 
{ 
    return dbSet.FindAsync(id); 
} 

サービス

public Task<Animal> GetAsync(int id) 
{ 
    return animalRepository.GetAsync(id);;  
} 

API

あなたが期待するよう次にAPIのソースコードは動作します。 Task<Animal>変数を取る代わりに呼び出しを待つことで少し単純化して、あなたの動物を得ることができます。

[HttpGet] 
public async Task<IHttpActionResult> Get(int id) 
{ 
    var animal = await animalManager.GetAsync(id); 

    return Ok(animal); 
} 

また、あなたのレポとサービス層のコードが簡単にそれを待っているのではなく、非同期操作を表しTaskを返すことができます。既存のAPI(具体的にはEF)を活用してください。これは、手動での呼び出しがTask.RunまたはTask.Factory.StartNewよりも優先されます。

+0

これは完璧に動作します。 – Tomuke

関連する問題