跟踪长时间的重复操作

时间:2015-09-06 21:41:47

标签: c# entity-framework

在我的代码中,我需要对许多不同的邮政编码执行操作,每个操作最多可能需要几秒钟,并且可能包含数千个需要处理的邮政编码。我需要能够跟踪它并重新启动它,如果它因任何原因被终止。

我有想法创建一个像这样的搜索实体:

public class Search
{
    public int ID { get; set; }
    public virtual ICollection<PostCode> PostCodes { get; set; }
}
public class PostCode
{
    public int ID { get; set; }
    public string Value { get; set; }
}

我无法弄清楚如何跟踪它。我的第一个想法是在每次成功操作之后从PostCode中的集合中删除Search并保存它以便每次加载对象时它只有未经处理的邮政编码,但是当我这样做时它抛出一个异常。

像这样:

using (var db = new MyDbContext())
{
    foreach (var pc in search.PostCodes)
    {
        DoSomeStuff(pc);
        search.PostCodes.Remove(pc);
        db.SaveChanges();
    }
}

我理解这是因为我无法更改我所枚举的对象,但出于某种原因,我无法想到一种简单的非复杂方式来跟踪数据库中的搜索。此外,由于有数千个邮政编码,我在这里也关注性能。

有谁能建议我应该如何跟踪搜索?

*编辑*

那么,如果我跟踪completed属性中处理的数字,这会正常工作吗?

using (var db = new MyDbContext())
{
    foreach (var pc in search.PostCodes.Skip(search.Completed))
    {
        DoSomeStuff(pc);
        search.Completed ++;

        db.SaveChanges();
    }
}

如果我保存然后使用Entity Framework加载实体,它是否始终保持IEnumberale的顺序相同?

**另一个编辑**

这是我在实际代码中加载搜索对象的地方:

rs = db.RadarSearches.Include("PostCodes").FirstOrDefault(x => x.Keyword.Value == keyword && x.Complete == false);

我想如果我在这里执行订购,那么我可以使它保持一致。如何订购嵌套的PostCodes集合?

1 个答案:

答案 0 :(得分:0)

  1. 将结果存储为数组并将该数组存储在文件中,以便您可以恢复(假设搜索结果可能在不同时间发生变化)。使用该文件,您需要将索引保存在原来的位置。在您的进程恢复时,您从文件和最后一个成功处理的索引加载数组。
  2. 您可以存储整个对象并删除成功处理的对象,但出于性能考虑,您只需将文件保存在每个第5或第10个游行中。
相关问题