BreakRoleInheritance在多线程情况下调用的问题

SPWeb, SPList, SPListItem对象都有这个方法. BreakRoleInheritance这个方法涉及到SharePoint内部的权限的复杂实现和调用, 这个方法在单线程的情况下工作良好, 但是在多线程的场景下(比如Event Handler中调用这个方法)会出现一些奇怪的问题. 主要的特征就是Event View中会看到ID 为6875的错误.

每个6875错误的详细信息会有些许不同.

 

根本原因可能是因为在BreakRoleInheritance方法中, 有一句对使得SPWeb无效的内部调用. SPWeb实际上并不是一个纯的C#对象, 它占有的资源需要被明确释放, 可能这个对象在BreakRoleInheritance的多线程调用下的控制并没实现的很好.

 

如果要避免这样的问题发生, 我们需要使用C#的lock语句来在这个方法的调用上套上critical section, 来进行线程同步的控制. 代码样例如下:

 

public class TestHandler: SPItemEventReceiver
{
    static object oDummy = new object();

    public override void ItemUpdated(SPItemEventProperties properties)
    {
        try
        {
            lock (oDummy)
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    using (SPSite site = new SPSite(properties.WebUrl))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            //Other code lines
                            //...........
                            web.BreakRoleInheritance(false);

                            //Other code lines 
                        }
                    }
                }); 
            }
        }
        catch (Exception ex)
        {
            throw ex.Message;
        }
    }
}

 

参考资料:

BreakRoleInheritance and AllowUnsafeUpdates

http://www.wictorwilen.se/Post/BreakRoleInheritance-and-AllowUnsafeUpdates.aspx

posted on 2010-05-27 21:14  中道学友  阅读(612)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上