在Thread,ThreadPool,RegisterAsyncTask中使用SpSite?

时间:2012-12-06 13:28:20

标签: c# multithreading sharepoint threadpool spsite

关于在Sharepoint中开发多线程webpart,我有几个问题。首先,让我解释一下这个想法。我有一个包含5-7个不同webpart的页面。这些webparts以相同的方式构建,这意味着:

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

b)将该数据转换为xml

c)执行xslt转换以生成html

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

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

Q1)使用这种技术应该提高页面的性能,对吧?

我的假设: 我在页面上有5个webpart,一个webpart需要500ms

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

之后:Max(wp1,wp2,wp3,wp4,wp5)在我的情况下将是500ms。

现在,我的第一个问题: Q2)我是对的吗?如果没有,为什么?

现在让我们详细介绍一下实施方法。我应该使用哪种技术?

  1. 创建一个新线程,然后调用Thread.join()
  2. 使用ThreadPool
  3. 或者在OnPreRender中调用Page.RegisterAsyncTask
  4. 此时我还有其他一些问题:

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

    问题4)您建议我使用哪种实施/架构?

    Q5)如果我在OnPreRender方法中使用Page.RegisterAsyncTask,我确信只在所有任务完成后才调用RenderContents方法吗?

    我尝试使用Threads实现,但似乎无法正常工作。一旦我尝试访问SpSite,我就会遇到以下异常:

      在Microsoft.SharePoint.SPSite.InitUserToken的Microsoft.SharePoint.Library.SPRequest.GetTokenOfCurrentUser(Boolean bWindowsMo​​de,String bstrLogin,String bstrUserKey,String bstrRoles,UInt32 ulRoleCount)上的Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)

    ( SP.Request请求)在Microsoft.SharePoint.SPSite的Microsoft.SharePoint.SPSite.SPSiteConstructor(SPFarm场,Guid applicationId,Guid contentDatabaseId,Guid siteId,Guid siteSubscriptionId,SPUrlZone区域,Uri requestUri,String serverRelativeUrl,Boolean hostHeaderIsSiteName,SPUserToken userToken)。 ctor(SPFarm farm,Uri requestUri,Boolean contextSite,SPUserToken userToken)at Microsoft.SharePoint.SPSite..ctor(String requestUrl)

    我尝试使用Page.RegisterAsyncTask进行实现,但是我遇到了以下异常:

      

    尝试在单线程模式下对多个线程进行调用。 (来自HRESULT的异常:0x80010102(RPC_E_ATTEMPTED_MULTITHREAD))Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)at Microsoft.SharePoint.Library.SPRequest.SetIPAddr(String bstrIPAddr)at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite site,String name) ,Boolean bNotGlobalAdminCode,String strUrl,Boolean bNotAddToContext,Byte [] UserToken,String userName,Boolean bIgnoreTokenTimeout,Boolean bAsAnonymous)at Microsoft.SharePoint.SPWeb.InitializeSPRequest()at Microsoft.SharePoint.SPWeb.GetList(String strUrl)   

    我如何实现这样的架构?

    亲切的问候

0 个答案:

没有答案