1
public 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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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

更新后样子:

恩,就是10次。。。不知道您是否在意过这个地方呢,呵呵。
我想,是不是SPListItem的Update方法重新引发了ItemUpdated事件导致了死循环,而MOSS又有某种机制,使得这种循环只发生10次就退出。
当然,这只是我的猜想,没有真凭实据,如果您知道,麻烦您告诉我,谢谢。
这个问题的解决方法也是很简单,就是使用DisableEventFiring和EnableEventFiring这两个方法,在那篇文章中有说明,下面的留言也有参考URL,代码就象下面这样:
1
SPListItem item = properties.ListItem;
2
item["Title"] = "updated_" + item["Title"].ToString();
3
this.DisableEventFiring();
4 item.Update();
5
this.EnableEventFiring();

2

3

4 item.Update();
5

更改代码后,再试,正常。
相关文章在这里:
http://www.sharepointsecurity.com/blog/sharepoint/sharepoint-2007-development/sp-event-recievers-firing-10-times-on-purpose/