C# 在线程、线程池、注册表同步任务中使用SpSite?

C# 在线程、线程池、注册表同步任务中使用SpSite?,c#,multithreading,sharepoint,threadpool,spsite,C#,Multithreading,Sharepoint,Threadpool,Spsite,关于在Sharepoint中开发多线程Web部件,我有几个问题。首先,让我解释一下这个想法。我有一个有5-7个不同网页的网页。这些Web部件的构造方式都相同,这意味着: a) 从一些SPList中检索一些数据 b) 将该数据转换为xml c) 执行xslt转换以生成html d) 在RenderContents方法中输出html内容 对于单个Web部件,此过程大约需要500毫秒 现在我的想法是使用线程进行一些性能调优。 在执行管道的早期方法(例如OnLoad)的最佳情况下,或者在OnPreRen

关于在Sharepoint中开发多线程Web部件,我有几个问题。首先,让我解释一下这个想法。我有一个有5-7个不同网页的网页。这些Web部件的构造方式都相同,这意味着:

a) 从一些SPList中检索一些数据

b) 将该数据转换为xml

c) 执行xslt转换以生成html

d) 在RenderContents方法中输出html内容
对于单个Web部件,此过程大约需要500毫秒

现在我的想法是使用线程进行一些性能调优。 在执行管道的早期方法(例如OnLoad)的最佳情况下,或者在OnPreRender方法的最坏情况下,前面描述的所有进程都可以由线程执行。 在RenderContents方法中,我可以在最坏的情况下等待线程完成(当然这里我会实现一些超时逻辑)

Q1)使用这种技术应该可以提高页面的性能,对吗

我的假设是: 我有5个网页上的网页和一个网页需要500毫秒

之前:执行时间为5*500ms=2500ms

之后:Max(wp1,wp2,wp3,wp4,wp5),在我的例子中是500ms

现在,我的第一个问题是: 问题2)我是对的吗?若否,原因为何

现在让我们更详细地介绍一下实现。我应该使用哪种技术

  • 创建一个新线程,然后调用Thread.join()
  • 使用线程池
  • 或者在OnPreRender中调用Page.RegisterAsyncTask
  • 在这一点上,我还有几个问题:

    问题3)因为,我正在使用SPSite,而且我读到这个对象是基于COM的。我可以使用ThreadPool或Page.RegisterAsyncTask吗?在一些博客中,我读到ThreadPool不支持COM对象,因为公寓模式(MTA vs STA)。此外,我认为Page.RegisterAsyncTask也在使用线程池

    问题4)您建议我采用哪种实施/体系结构

    问题5)如果我在OnPreRender方法中使用Page.RegisterAsyncTask,我是否确定只有在所有任务完成时才调用方法中的RenderContents

    我尝试了线程实现,但它似乎不起作用。当我试图访问SpSite时,我得到以下异常:

    在Microsoft.SharePoint.SPSite.SPSite构造函数的Microsoft.SharePoint.Library.SPRequest.GetTokenOfcCurrentUser(布尔bWindows模式、字符串bstrLogin、字符串bstrUserKey、字符串bstrRoles、UInt32 ulRoleCount)的Microsoft.SharePoint.SPSite.InitUserToken(SPRequest请求)的Microsoft.SharePoint.SPSite(SPFarm场,Guid applicationId,Guid contentDatabaseId,Guid siteId,Guid siteSubscriptionId,SpulZone区域,Uri requestUri,String serverRelativeUrl,Boolean hostHeaderIsSiteName,SPUserToken userToken)位于Microsoft.SharePoint.SPSite..ctor(SPFarm场,Uri requestUri,Boolean contextSite,SPUserToken)位于Microsoft.SharePoint.SPSite..ctor(字符串请求URL)

    我尝试了Page.RegisterAsyncTask的实现,但出现以下异常:

    尝试在单线程模式下调用多个线程。(HRESULT的异常:0x80010102(RPC_E_尝试_多线程))位于Microsoft.SharePoint.SPGlobal.HandleComeException(COMException comEx)位于Microsoft.SharePoint.Library.SPRequest.SetIPAddress(字符串bstrIPAddr)位于Microsoft.SharePoint.SPGlobal.CreateSprequesteAndSetIdentity(位于Microsoft.SharePoint.SPWeb.InitializeSPRequest()的Microsoft.SharePoint.SPWeb.GetList(字符串strUrl)上的SPSite站点、字符串名称、布尔bNotGlobalAdminCode、字符串strUrl、布尔bNotAddToContext、字节[]UserToken、字符串用户名、布尔BigNoreTokentTimeout、布尔bAsAnonymous)

    如何实现这样的体系结构


    亲切问候

    您在优化步骤a-d方面投入了多少精力?如果您能将每个步骤的时间缩短到100ms,净效果即使不比线程解决方案好也会一样好,尤其是在重载情况下。例如,您能否跳过将列表项转换为XML->XSLT->HTML而直接从列表项转换为HTML?还有,哈您是否研究过缓存部分或所有web部件输出?您好,Patren xml->xslt->html非常完美。我有一个web部件,可以在其中指定指向sp列表的url,指向xslt的url(xslt保存在共享文档中)现在我非常灵活:如果我想更改html,我只需要修改xslt,而不需要发布所有解决方案。