Планирование заданий таймера при вводе таблицы данных в SharePoint - PullRequest
1 голос
/ 13 июля 2010

У меня есть список, в котором у меня есть обработчик ItemUpdated.

Когда я редактирую с использованием представления таблицы и изменяю каждый элемент, событие ItemUpdated, очевидно, будет выполняться для каждого отдельного элемента.

В моем событии ItemUpdated я хочу, чтобы он проверил, запланировано ли задание таймера.Если есть, то продлите расписание SPOneTimeSchedule этого задания, чтобы задержать его на 5 секунд.Если нет, то создайте задание таймера и запланируйте его на 5 секунд.

Я попытался выяснить, существует ли определение задания в обработчике, и если оно существует, тогда расширьтеграфик на 5 секунд.Если его не существует, создайте определение задания для запуска в течение нескольких минут.

MyTimerJob rollupJob = null;
foreach (SPJobDefinition job in web.Site.WebApplication.JobDefinitions) 
{
    if (job.Name == Constants.JOB_ROLLUP_NAME)
    {
        rollupJob = (MyTimerJob)job;
    }
}
if (rollupJob == null)
{
        rollupJob = new MyTimerJob(Constants.JOB_ROLLUP_NAME, web.Site.WebApplication);
}

SPOneTimeSchedule schedule = new SPOneTimeSchedule(DateTime.Now.AddSeconds(5));
rollupJob.Schedule = schedule;
rollupJob.Update();

Когда я пробую это на сервере, я получаю много ошибок

"Возник конфликт обновления, и вы должны повторить это действие. Объект MyTimerJob Name = MyTimerJobName Parent = SPWebApplication Name = SharePoint -80 обновляется NT AUTHORITY \ NETWORK SERVICE в процессе w3wp

Я думаюзадание, вероятно, запускается в первый раз и после его запуска поступают другие события ItemUpdated и находят существующее определение задания. Затем оно пытается обновить это определение, даже если оно используется в настоящее время. Должен ли я создать новое имя определения заданиячтобы он не наступил на первое? Или увеличил время до минуты?

Ответы [ 3 ]

1 голос
/ 15 июля 2010

Я решил это сам, просто установив задержку на минутное время, независимо от того, найдено ли определение. Таким образом, пока он занят, он будет продолжать откладывать планирование заданий до тех пор, пока не будет завершена обработка

0 голосов
/ 14 июля 2010

Может быть, вам стоит попробовать использовать «блокировку» для объекта задания таймера?

0 голосов
/ 14 июля 2010

Это потому, что событие асинхронное. Вам нужно будет переосмыслить именно то, что вы пытаетесь решить с помощью этого кода, и потенциально изменить его.

...