[英]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
}
我擔心我不了解我的代碼流程。
按照要求:
我認為的重要部分:
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);
回答你的問題:
ssisMethod
在CreateAndSendReports
之前返回為了實現您的目標,您可以將您的方法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.