2016-08-15 79 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

也请记住,只有当您有异步事件处理程序时才想使用异步无效。这是唯一具有异步无效的合适位置。 –