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