2017-03-09 72 views
-1

我試圖創建一個服務於從數據庫中獲取我所有的箱子是這樣的:異步操作仍懸而未決

[HttpGet] 
[Route("GetBoxes/")] 
[ResponseType(typeof(ResultQuery))] 
public async Task<IHttpActionResult> GetBoxes() 
{ 
    try 
    { 
     var boxes = db.Boxes.ToList<Box>(); 
     foreach (Box in boxes) 
     { 
      status.Add(GetBox(box)); 
     } 
     return Ok(ConvertToResultQuery(boxes)); 
    } 
    catch (Exception e) 
    { 
     return InternalServerError(e); 
    } 
} 

public GenericBox GetBox(Box box) 
{ 
    try 
    { 
     //Do a lot of stuff with the database 
     return genericBox; 
    } 
    catch (Exception e) 
    { 
     return null; 
    } 
} 

public static ResultQuery ConvertToResultQuery(object result) 
{ 
    return new ResultQuery(result); 
} 

凡ResultQuery具有包含我的服務的結果只有一個對象的屬性。

的服務很簡單,但由於某種原因,它給了我,當我嘗試在郵遞員這個錯誤:

異步模塊或處理程序,而異步操作仍有待完成。

VisualStudio中也給了我一個警告,建議使用等待,但我不明白的地方我應該把它。

+1

GetBox應該是異步的。很確定它是公共異步任務GenericBox GetBox(Box box){}。這裏是一個示例頁面https://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx – Programmer

回答

1

GetBoxes方法是異步方法,但你的GetBox不是。

你說你正在做的GetBox方法內部數據庫的工作,但一切都在那個方法同步運行。考慮改變GetBox的簽名:

public async Task<GenericBox> GetBox(Box box) 
{ 
    try 
    { 
     //Do a lot of stuff with the database 
     //'await' database calls here 
     return genericBox; 
    } 
    catch (Exception e) 
    { 
     return null; 
    }   
} 

然後在您的GetBoxes方法改變你的foreach到Task.WhenAll()代替:

var result = await Task.WhenAll(boxes.Select(x => GetBox(x))); 

result變量將是一個任務

如果你不想惹Task.WhenAll(),你可以簡單地awaitGetBox方法的循環中:

status.Add(await GetBox(box)); 
+0

謝謝!我是否也應該在第一個ToList調用中使用異步? 「var boxes = db.Boxes.ToList ();」 – user2088807

+0

儘可能使用異步方法。如果你使用EF並且'ToListAsync'對你可用,那麼你應該使用並等待。 – maccettura

+0

現在一切都建立了,但當我嘗試郵遞員的服務時,我仍然得到例外。 – user2088807