Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Orchard CMS:在循环中创建ContentItems会造成延迟_C#_Orchardcms_Orchardcms 1.8 - Fatal编程技术网

C# Orchard CMS:在循环中创建ContentItems会造成延迟

C# Orchard CMS:在循环中创建ContentItems会造成延迟,c#,orchardcms,orchardcms-1.8,C#,Orchardcms,Orchardcms 1.8,根本问题 我面临的问题源于需要从电子表格导入数据。 一旦开始导入,用户必须能够离开页面,并在稍后导入完成时返回。 到目前为止,我知道的选项是预定任务和乌节的后台工作人员,据我所知,他们每分钟都会被扫描触发一次。(如果我忽略了更好的选择,请告诉我) 问题 我基本上必须在循环中创建新的内容项。在遇到一些问题一段时间后,我设置了一个非常简单的测试,使用ajax调用为每个调用创建X个虚拟项并对其计时。 我发现每次迭代创建一个项目所需的时间略有增加。如果创建第一个项目可能需要20毫秒,则创建循环中的nr

根本问题
我面临的问题源于需要从电子表格导入数据。 一旦开始导入,用户必须能够离开页面,并在稍后导入完成时返回。
到目前为止,我知道的选项是预定任务和乌节的后台工作人员,据我所知,他们每分钟都会被扫描触发一次。(如果我忽略了更好的选择,请告诉我)

问题
我基本上必须在循环中创建新的内容项。在遇到一些问题一段时间后,我设置了一个非常简单的测试,使用ajax调用为每个调用创建X个虚拟项并对其计时。
我发现每次迭代创建一个项目所需的时间略有增加。如果创建第一个项目可能需要20毫秒,则创建循环中的nr 200将需要150毫秒。这似乎没有屋顶,只是每次迭代都会变得越来越糟

如果您想查看测试代码:

    public TimeSpan CreateRandomItem(int nr)
    {
        Stopwatch sw = Stopwatch.StartNew();

        ContentItem item = _services.ContentManager.New("MyItemType");
        var myPart = item.As<MyPart>();
        myPart.Name = "Test nr " + nr;
        _services.ContentManager.Create(item);

        sw.Stop();
        return sw.Elapsed;
    }

    public JsonResult TestCreation(int amount, int nrReached)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = nrReached + 1; i <= (nrReached + amount); i++)
        {
            TimeSpan elapsed = _associationImportService.CreateRandomAssociation(i);
            sb.Append("\n - Nr " + i + " took " + elapsed.TotalMilliseconds + "ms");
        }
        return Json(sb.ToString(), JsonRequestBehavior.AllowGet);
    }
public TimeSpan CreateRandomItem(整数编号)
{
秒表sw=Stopwatch.StartNew();
ContentItem=_services.ContentManager.New(“MyItemType”);
var myPart=item.As();
myPart.Name=“测试编号”+编号;
_services.ContentManager.Create(项);
sw.Stop();
返回经过的开关;
}
公共JsonResult TestCreation(整数金额,整数NRREACH)
{
StringBuilder sb=新的StringBuilder();

对于(int i=nrreach+1;i我们在数据导入期间创建大量内容项时遇到了类似的问题

我们采取的步骤是:

  • 将导入移动到
    • 这意味着您在IIS工作进程之外,并且与在那里运行创建代码相关的任何超时/锁定都在该进程之外
    • 如果您需要将流程保留在Orchard UI中,那么这可能不是一个选项
  • 将工作移动到批处理,并在循环调用中的每个项或每个x项之后移动
    • \u orchardServices.TransactionManager.requireRenew()
      强制提交事务
    • \u orchardServices.ContentManager.Clear()
      清除对任何内容项的引用

您需要注入一个
IOrchardServices
来访问这些方法。

看看这个:公平点。性能测试不应该包含那个错误。我更新了代码以使用StringBuilder,并再次运行它,结果相同。正如您提到的,我需要将导入保留在UI中。但我遵循了您的第二个建议,它将rks就像一个符咒。调用Require和Clear会有开销,所以我只会每隔X次调用一次,延迟就会重置。非常感谢你,你是一个救生员,我会为你建造一个神龛!哇,这带来了巨大的变化。谢谢!