1

我有一个列表,上面有一个 ItemUpdated 处理程序。

当我使用数据表视图编辑并修改每个项目时,ItemUpdated 事件显然将为每个项目运行。

在我的 ItemUpdated 事件中,我希望它检查是否有计划运行的计时器作业。如果有,则延长此作业的 SPOneTimeSchedule 计划以将其延迟 5 秒。如果没有,则创建 Timer Job 并从现在开始将其安排为 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 正在 w3wp 进程中由 NT AUTHORITY\NETWORK SERVICE 更新

我认为该作业可能是第一次运行,一旦运行,其他 ItemUpdated 事件就会进入并找到现有的作业定义。然后它会尝试更新这个定义,即使它当前正在被使用。我应该创建一个新的工作定义名称,这样它就不会超过第一个吗?还是将时间提高到一分钟?

4

3 回答 3

1

我自己解决了这个问题,只需将延迟设置为从现在开始的几分钟时间,无论是否找到定义。这样,当它很忙时,它会不断推迟作业的调度,直到它完成处理

于 2010-07-15T11:00:00.817 回答
0

这是因为事件是异步的。您需要重新考虑您要使用此代码解决的问题,并可能对其进行重构。

于 2010-07-13T23:08:49.553 回答
0

也许您应该尝试在计时器作业对象上使用“锁定”?

于 2010-07-14T06:23:03.980 回答