2016-07-01 120 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

它是編譯還是運行時錯誤? 你是否嘗試過使用異步版本的DbSet,FindAsync() ? – 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.RunTask.Factory.StartNew更受歡迎。

+0

這很好,謝謝你的建議! – Tomuke