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次调用一次,延迟就会重置。非常感谢你,你是一个救生员,我会为你建造一个神龛!哇,这带来了巨大的变化。谢谢!