尝试使用 Hangfire 时的自引用循环

问题描述 投票:0回答:2

我正在 ASP.NET Core 中开发 Web API,我们发现自己需要为大型批量插入操作运行后台任务。然而,我插入的模型包含

Geometry
类型的属性,来自 .NET Topology Suite

public class GeometricData
{
    //...

    public Geometry Geometry { get; set; }
}

为了批量插入,我正在遵循我在here 中找到的方法,它非常有效,但它的实现超出了这个问题的范围。尽管速度很快,但例如,用户可能会一次性插入超过一百万条记录,因此我们决定将此处理转移到后台任务。 Hangfire 扩展起初看起来可以为我们节省很多时间,但它似乎不能很好地处理

Geometry
类型。在下面的代码中,
BackgroundTask
方法也可能是一个空方法:

public Task BulkInsert(IEnumerable<GeometricData> list)
{
    BackgroundJob.Enqueue(() => BackgroundTask(list));

    return Task.CompletedTask;
}   

只是在

Geometry
的操作中将
BackgroundTask
的列表作为参数传递给
Enqueue
的行为将抛出不幸的错误:

Self referencing loop detected for property 'CoordinateValue' with type 'NetTopologySuite.Geometries.Coordinate'. Path '[0].Geometry.Coordinates[0]'.

事实上,

Coordinates
(NTS类)确实引用了自己:

不知道他们为什么要那样做,但他们做到了。无论如何,到目前为止一切都很好,但除非我设法找到解决这个问题的方法(或者甚至可能绕过它),否则我将从头开始实施后台工作人员会遇到很多麻烦(我'我们将使用 Worker Service,以防万一有人想知道)。有什么指示吗?

c# gis asp.net-core-webapi hangfire nettopologysuite
2个回答
0
投票

Man,在几何和坐标上方添加 JsonIgnoreAttribute,另外:检查以下链接:newtonsoft.com/json/help/html/PropertyJsonIgnore.htm


0
投票

Hangfire 将尝试序列化传递给函数的任何参数,以便它可以在任何重复作业期间重播它。我假设您正在使用类似这样的方法:

RecurringJob.AddOrUpdate("test", () => BulkInsert(theList), Cron.Minutely);

相反,如果可能的话,尝试访问函数内的列表,这样 Hangfire 就不会序列化它。

RecurringJob.AddOrUpdate("test", () => BulkInsert(), Cron.Minutely);


public Task BulkInsert()
{
    var list = <theListFromSomewhere>;
    BackgroundJob.Enqueue(() => BackgroundTask(list));

    return Task.CompletedTask;
}  
© www.soinside.com 2019 - 2024. All rights reserved.