在完成之前停止中间的for循环

Ank*_*ita 7 c# asp.net solr

我们在asp.net c#project中使用Solrnet将文档索引到Solr中.我们要求Solr DIH不能使用,因此我们使用以下代码将产品分批索引到Solr:

decimal cycleCount = ProductCount / batchSize;
for (int i = 0; i <= Math.Round(cycleCount); i++)
{       
   var Products = Products(batchSize, languageId, storeId).ToList();
   solrCustomWorker.Add(solrProducts);
   solrCustomWorker.Commit();
}
Run Code Online (Sandbox Code Playgroud)

对于庞大的文档大小,完成整个过程需要花费大量时间(大部分时间需要几个小时),有时我们需要通过手动干预来中断此过程.

但是,我不确定如何在它完成之前停止这两个索引批处理循环.具有大批量文档的单个循环,需要几秒钟才能完成,然后提交.但考虑到巨大的没有.在执行完整索引时,文档需要几个小时,我们无法在两者之间停止此过程.

任何想法 - 如何在中间停止这个过程..我无法弄清楚应该在这里做什么?

请建议.

Dav*_*rno 5

您可以采取以下两种方法:

1使用全局变量(这不是一个好的解决方案,希望有明显的原因):

public static bool KeepRunning;

...

for (int i = 0; i <= Math.Round(cycleCount); i++)
{
    if (KeepRunning)
    {    
        var Products = Products(batchSize, languageId, storeId).ToList();
        solrCustomWorker.Add(solrProducts);
        solrCustomWorker.Commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

2使用回调检查是否继续运行:

public void SomeMethod(Func<bool> keepRunning)
{
    for (int i = 0; i <= Math.Round(cycleCount); i++)
    {
        if (keepRunning())
        {    
            var Products = Products(batchSize, languageId, storeId).ToList();
            solrCustomWorker.Add(solrProducts);
            solrCustomWorker.Commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二种方法的优点是您可以将决策逻辑与索引逻辑分离并避免全局变量,例如通过捕获是否在对长时间运行的进程和事件处理程序的异步调用的闭包内保持运行.