我需要将两组数据批量加载到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();
尽管这样做的问题是groupA
的Status
可以是RanToCompletion
,而Result
的Status
是Faulted
(例如,当查询存在语法错误时),因此,在执行queryA
期间任何可能的错误都不会被捕获,我猜这需要检查groupA.Result.Exceptions
。
考虑到这些挑战,我不确定在同步方法中等待依赖Neo4j任务的推荐方式是什么。
1条答案
按热度按时间s5a0g9ez1#
您需要的是等待Func作用域中的
result.ToListAsync
。在读取结果之前,您的事务正在完成,并且在事务关闭之后,您将无法再访问结果。它有时会成功完成的原因是,
result.ToListAsync
任务在提交和关闭事务之前完成。