簡體   English   中英

線程循環的異步基礎

[英]Async fundamentals for threading a loop

我希望這是我試圖理解的一個非常簡單的代碼示例。

我想在等待長時間運行的過程完成時繼續重新啟動該過程。 目標是同時運行所有批次。 例如:

while(moreToProcess())
{
   var batch = CreateBatch();
   await ssisMethod(batch); //takes 30 seconds and would like to start next batch
   CreateAndSendReports(batch); //Must wait for ssisMethod to complete
}

我擔心我不了解我的代碼流程。

  1. 它會在等待時啟動另一批嗎?
  2. 在創建報告之前會等待完成嗎?

按照要求:

我認為的重要部分:

      public static async Task ssisMehtod(varBatch)
      {                      
            using (OleDbConnection conn = new OleDbConnection(cstr))
            {
                using (OleDbCommand cmd = new OleDbCommand(sql, conn))
                {
                    cmd.Parameters.Add("@p1", OleDbType.Integer).Value = batchID;
                    cmd.Parameters.Add("@p2", OleDbType.VarWChar, 9).Value = DUNS;
                    conn.Open();
                    await cmd.ExecuteNonQueryAsync();
                }
            }
       }

您可以保存所有任務並在 WhenAll 代碼繼續后一起運行它們

       var tasks = new List<Task>();

        while (condition is true)
        {
            tasks.Add(Task.Run(async () =>
            {
                var batch = CreateBatch();
                await ssisMethod(batch); 
                CreateAndSendReports(batch); 
            }));
        }

        Task.WhenAll(tasks);

回答你的問題:

  1. 不,它不會在等待時啟動另一批。 它所做的只是釋放主線程,因此您的主線程/ UI 線程不會掛在那里。
  2. 是的,它會等到ssisMethodCreateAndSendReports之前返回

為了實現您的目標,您可以將您的方法CreateAndSendReports包裝為異步。 並創建另一個包裝方法,例如ProcessBatch

public static async Task ProcessBatch(Batch batch)
{
  await ssisMethod(batch).ConfigureAwait(false);
  await CreateAndSendReports(batch).ConfigureAwait(false);
}

while(moreToProcess())
{
   var batch = CreateBatch();
   ProcessBatch(batch).ConfigureAwait(false); //Program will not wait here, it will proceed to create another batch.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM