Корня
Проблемы я столкнулся проистекает из необходимости импорта данных из электронных таблиц. После того, как импорт был запущен, пользователь должен иметь возможность покинуть страницу и вернуться позже, когда импорт будет выполнен.
До сих пор параметры, о которых я знаю, - это запланированные задачи и фоновые работники в Орчард, которые, как я понимаю, запускаются раз в минуту с помощью развертки. (Пожалуйста, дай мне знать, если есть лучший вариант я проглядел)Orchard CMS: Создание ContentItems в цикле создает проблему задержки
Вопрос
Я в принципе создать новые элементы контента в цикле. И после того, как я столкнулся с некоторыми проблемами в течение некоторого времени, я установил очень простой тест с вызовом 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);
}
После цикла завершения вызова Ajax запускает снова и теперь задержка резко снижается, начиная с более чем около 30 мс. Он не полностью восстанавливается в небольшом интервале между первым и вторым вызовами ajax, но это имеет огромное значение.
Я предполагаю, что это может быть связано с оставлением WorkContext, может быть? Но я не могу найти способ заставить это произойти, пока я остаюсь внутри цикла. Поскольку развертка работает только раз в минуту, я не могу придумать, как избежать этого цикла.
Вопрос
Есть ли что я могу сделать, чтобы избежать этой задержки накопления в то время как внутри цикла, или, возможно, другой подход к запуска импорта, что я упускать из виду? (Имейте в виду, что это должно выполняться в фоновом режиме, пока пользователя нет на странице) (Возможно, стоит упомянуть, что элемент, который я последний раз тестировал, не имеет индекса поиска от Lucene, но у него есть поля, которые я предполагаю необходимо добавить к индексированию поля. Если это имеет значение)
Спасибо.
Взгляните на это: https://msdn.microsoft.com/en-us/library/ms182272%28v=vs.80%29.aspx –
Справедливая точка. Тест производительности не должен содержать эту ошибку. Я обновил код для использования StringBuilder и снова запустил его с тем же результатом. –