[英]How to wait for all threads created within a method
在c#中,我必須確保處理程序中的某個代碼塊只能在多個線程完成后執行。 這些線程是從在上述代碼塊之前的同一個處理程序中調用的方法調用的。 使用的語法與我正在使用的DBMS相關,即Starcounter。
Handle.GET("/path/to/HandlerStartTests", () =>
{
// some code
startMethod();
// some code that relies on what happens within startMethod
}
public static void startMethod()
{
QueryResultRows<PO> pos = Db.SQL<PO>("SELECT po FROM PO po");
foreach (var po in pos)
{
DbSession dbSession = new DbSession();
dbSession.RunAsync(() =>
{
// Do some stuff in the Starcounter database
});
}
}
這是出於單元測試目的,因此我無法對startMethod
進行任何更改。 關於如何解決這個問題的任何想法?
startMethod是火與遺忘,因為異步任務不是在DbSession.RunAsync()中收集的。 如果不修改此方法,則不會引用已啟動的任務等待。
如果可以修改此方法,則可以包裝同步調用DbSession.Sync(),如果在任務中定義了這樣,並等待這些任務。
QueryResultRows<PO> pos = Db.SQL<PO>("SELECT po FROM PO po");
List<Task>tasks = new List<Task>();
foreach (var po in pos)
{
DbSession dbSession = new DbSession();
var task = Task.Run(()=>
dbSession.RunSync(() =>
{
// Do some stuff in the Starcounter database
}));
tasks.Add(Task);
}
Task.WaitAll(tasks.ToArray());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.