2010-07-13 2 views
1

У меня есть список, на котором у меня есть обработчик ItemUpdated.Планирование задания таймера на входе DataSheet в SharePoint

Когда я редактирую, используя представление таблицы данных и изменяя каждый элемент, событие 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 Родитель = SPWebApplication Name = SharePoint -80 обновляется службой NT AUTHORITY \ NETWORK SERVICE в процессе w3wp

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

ответ

1

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

0

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

+0

Да, я знаю, что события с обновлением и добавлением являются асинхронными - мне нужно использовать эти события, однако, поскольку я Меня интересуют изменения только после того, как они сделаны – Graeme

0

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

Смежные вопросы