2016-08-15 4 views
0

私はawaitコールの後に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は無効ですか?または、おそらく非同期メソッドですか? – lxalln

+0

どこかでデッドロックのように聞こえる、 'ConfigureAwait'を追加しようとしましたか? – DavidG

答えて

1

async voidを間違って使用しています。代わりにTaskまたはTask<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/catchTaskを正しく使用することで、問題を特定するのに役立ちます。

+2

また、非同期のイベントハンドラがある場合にのみ、async voidを使用したいことに注意してください。これは、非同期ボイドを持つ唯一の適切な場所です。 –

関連する問題