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

你可能感兴趣的:(inheritance)