2016-08-15 31 views
0

在等待呼叫後,我遇到了foreach循環的問題。 purchaseOrders被填充4個訂單,但每次都會停止foreach,直到達到4次迭代。執行停止,並且不會運行GetInvoices調用。等待後的foreach

GetPurchaseOrders("50000"); 
GetInvoices("10000"); 

static async void GetPurchaseOrders(string supplier) 
{ 
    var purchaseOrders = await VNA.PurchaseOrders.ForSupplierAsyncTask(supplier); 

    foreach (var order in purchaseOrders) 
    { 
     CreateXMLDocument(order, order.orderNbr, "PurchaseOrder"); 
    } 
} 
+0

跟蹤顯示你什麼? – BugFinder

+1

是CreateXMLDocument void?或者也許是一種異步方法? – lxalln

+0

聽起來像是一個死鎖,你嘗試添加'ConfigureAwait'嗎? – DavidG

回答

1

您正確使用的是async void。而是返回TaskTask<T>。考慮以下幾點:

static async Task GetPurchaseOrders(string supplier) 
{ 
    try 
    { 
     var purchaseOrders = await VNA.PurchaseOrders.ForSupplierAsyncTask(supplier); 

     foreach (var order in purchaseOrders) 
     { 
      CreateXMLDocument(order, order.orderNbr, "PurchaseOrder"); 
     } 
    } 
    catch (Exception ex) 
    { // <-- Place a breakpoint here... 
     // I would imagine you're getting an exception 
    } 
} 

Task(作爲返回類型)是底層異步狀態機如何理解狀態之間的相關性。此外,它允許適當的異常處理。

有可能您在數據庫連接上使用IEnumerable<T>,並且由於它是延遲執行加暫停的異步執行,因此可能在嘗試迭代之前或期間關閉連接。 try/catch和正確使用Task應該有助於查明問題。

+2

也請記住,只有當您有異步事件處理程序時纔想使用異步無效。這是唯一具有異步無效的合適位置。 –