在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
进行任何更改。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
startMethod是fire and forget,因为在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());