MOSS的ItemUpdated执行了10次,您碰到了吗?

在网上看到一篇文章说跟踪ItemUpdated,执行了10次,特验证一次,结果真的是执行10次。代码如下:

 1public class ListEventTest : SPItemEventReceiver
 2    {
 3        public override void ItemUpdated(SPItemEventProperties properties)
 4        {
 5            try
 6            {
 7                //using (SPWeb web = properties.OpenWeb())
 8                //{
 9                //    SPList list = web.Lists["testlist"];
10                //    SPListItem item = list.GetItemById(properties.ListItemId);
11                //    item["Title"] = "updated_" + item["Title"].ToString();
12                //    item.Update();
13                //    System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
14                //}
15                SPListItem item = properties.ListItem;
16                item["Title"= "updated_" + item["Title"].ToString();
17                item.Update();
18                System.Diagnostics.EventLog.WriteEntry("test event", item["Title"].ToString() + "is updated.");
19            }

20            catch (Exception ex)
21            {
22                System.Diagnostics.EventLog.WriteEntry("test event", ex.ToString());
23            }

24        }

25    }


我以为是不同代码调用造成的,就像SPSecurity.RunWithElevatedPrivileges,结果使用注释掉和没有注释掉的代码实验,结果是一样的。
更新一次item系统事件记录了10次。
更新前样子:



更新后样子:



恩,就是10次。。。不知道您是否在意过这个地方呢,呵呵。
我想,是不是SPListItem的Update方法重新引发了ItemUpdated事件导致了死循环,而MOSS又有某种机制,使得这种循环只发生10次就退出。
当然,这只是我的猜想,没有真凭实据,如果您知道,麻烦您告诉我,谢谢。

这个问题的解决方法也是很简单,就是使用DisableEventFiring和EnableEventFiring这两个方法,在那篇文章中有说明,下面的留言也有参考URL,代码就象下面这样:

1SPListItem item = properties.ListItem;
2item["Title"= "updated_" + item["Title"].ToString();
3this.DisableEventFiring();
4    item.Update();
5this.EnableEventFiring();

更改代码后,再试,正常。

相关文章在这里:
http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/sp-event-recievers-firing-10-times-on-purpose/

原文地址:https://www.cnblogs.com/ycc/p/836832.html