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

标签 c# asp.net solr

我们在 asp.net c# 项目中使用 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();
}

由于文档很大,完成整个过程需要很长时间(大多数情况下需要几个小时),有时我们需要通过人工干预在中间停止这个过程。

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

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

请提出建议。

最佳答案

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

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();
    }
}

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();
        }
    }
}

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

关于c# - 在完成之前停止中间的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33920063/

相关文章:

asp.net - "Attach to process"时未找到 w3p3.exe

c# - 是否可以在不使用 ASP.NET 的情况下使用 C# 编写网站脚本?

asp.net - ASP.NET MVC 5 中的自定义文件夹结构

java - org.apache.solr.common.SolrException : Document is missing mandatory uniqueKey field: id

c# - 从 web api JSON C# 中删除斜线

c# - 请求类在 Razor 页面中不可用

c# - 如何在 .NET 中正确转义文档名称?

c# - SQL 服务器 Microsoft.Data.SqlClient.SqlException (0x80131904) : Execution Timeout Expired on azure

Solr:从 solr 索引中检索字段名称?

solr - 在 Cent os 7 上将 Apache Solr 从 4.10.4 升级到 6.6.0