如何在C#中正确等待依赖Neo4j大容量加载任务

nukf8bse  于 2022-11-05  发布在  C#
关注(0)|答案(1)|浏览(167)

我需要将两组数据批量加载到Neo4j中。第二组基于第一组创建的节点和关系,因此在第一组完全提交之前无法加载第二组。
我当前的实现如下所示。

public override void Import()
{
    using var session = _driver.AsyncSession(
        x => x.WithDefaultAccessMode(AccessMode.Write));

    var groupA = session.WriteTransactionAsync(async x =>
    {
        var result = await x.RunAsync(queryA);
        return result.ToListAsync();
    });
    groupA.Result.Wait();

    var groupB = session.WriteTransactionAsync(async x =>
    {
        var result = await x.RunAsync(queryB);
        return result.ToListAsync();
    });
    groupB.Result.Wait();
}

请注意,我不能将方法更改为async;因此我没有使用await
此方法有时可以正确运行,但有时会出现如下所示的错误。
无法再访问此结果上的记录,因为该结果已被使用,或者创建该结果的查询运行程序已关闭。
我可以改用以下代码:

groupA.Wait();

尽管这样做的问题是groupAStatus可以是RanToCompletion,而ResultStatusFaulted(例如,当查询存在语法错误时),因此,在执行queryA期间任何可能的错误都不会被捕获,我猜这需要检查groupA.Result.Exceptions
考虑到这些挑战,我不确定在同步方法中等待依赖Neo4j任务的推荐方式是什么。

s5a0g9ez

s5a0g9ez1#

您需要的是等待Func作用域中的result.ToListAsync。在读取结果之前,您的事务正在完成,并且在事务关闭之后,您将无法再访问结果。

var groupA = session.WriteTransactionAsync(async x =>
    {
        var result = await x.RunAsync(queryA);
        return await result.ToListAsync();
    });
    groupA.Wait();
    var groupB = session.WriteTransactionAsync(async x =>
    {
        var result = await x.RunAsync(queryB);
        return await result.ToListAsync();
    });
    groupB.Wait();

它有时会成功完成的原因是,result.ToListAsync任务在提交和关闭事务之前完成。

相关问题