我有一个列表,其中有一个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();当我在服务器上尝试时,我得到了很多错误
“发生更新冲突,您必须重试此操作。NT AUTHORITY\NETWORK SERVICE正在w3wp进程中更新MyTimerJob Name=MyTimerJobName Parent=SPWebApplication Name=SharePoint -80对象
我认为作业可能是第一次运行,一旦运行,其他ItemUpdated事件就会进入并找到现有的作业定义。然后,它尝试更新此定义,即使它当前正在使用。我是否应该创建一个新的作业定义名称,以便它不会位于第一个名称的顶部?或者将时间提高到一分钟?
发布于 2010-07-15 19:00:01
我自己解决了这个问题,只需将延迟设置为从现在开始的一分钟时间,而不管是否找到定义。这样,当作业繁忙时,它将不断推迟作业的调度,直到它完成处理
发布于 2010-07-14 07:08:50
这是因为事件是异步的。你需要重新思考你到底想用这段代码来解决什么问题,并有可能对其进行重构。
发布于 2010-07-14 14:23:04
也许你应该试着在计时器作业对象上使用"lock“?
https://stackoverflow.com/questions/3238900
复制相似问题