3

在 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. 关于如何解决这个问题的任何想法?

4

1 回答 1

2

startMethod 是一劳永逸,因为异步任务没有收集在 DbSession.RunAsync() 中。如果不修改此方法,则不会引用要等待的已启动任务。

如果可以修改此方法,则可以在 Task 中定义同步调用 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());
于 2015-12-15T15:31:42.473 回答