SharePoint でのマルチスレッド Web パーツの開発に関していくつか質問があります。まず、考え方を説明します。5 ~ 7 個の異なる Web パーツを含むページがあります。これらの Web パーツはすべて同じ方法で構築されます。つまり、次のことを意味します。
a) いくつかの SPLists からいくつかのデータを取得する
b)そのデータをxmlに変換します
c) xslt 変換を実行して html を生成する
d) RenderContents メソッドで HTML コンテンツを出力する
このプロセスには、1 つの Web パーツに約 500 ミリ秒かかります。
今の私の考えは、スレッドを使用してパフォーマンスの調整を行うことです。前に説明したすべてのプロセスは、実行パイプの初期のメソッド (例: OnLoad) で最良の場合、または OnPreRender メソッドで最悪の場合にスレッドによって実行できます。RenderContents メソッドでは、最悪の場合、スレッドが終了するのを待つことができます (もちろん、ここではタイムアウト ロジックを実装します)。
Q1) この手法を使用すると、ページのパフォーマンスが向上するはずですよね?
私の仮定: ページに 5 つの Web パーツがあり、1 つの Web パーツに 500 ミリ秒かかります
前: 実行時間は 5*500ms = 2500ms です。
その後: Max(wp1, wp2, wp3, wp4, wp5) 私の場合は 500ms です。
さて、私の最初の質問: Q2) 私は正しいですか? そうでない場合、なぜですか?
それでは、実装について詳しく説明しましょう。どのテクニックを使用する必要がありますか?
- 新しいスレッドを作成し、Thread.join() を呼び出します
- スレッドプールを使用
- または、OnPreRender で Page.RegisterAsyncTask を呼び出します
この時点で、他にもいくつか質問があります。
Q3) SPSite を使用していて、このオブジェクトが COM に基づいていると読んでいましたが、ThreadPool または Page.RegisterAsyncTask を使用できますか? 一部のブログで、アパートメント モード (MTA と STA) のため、ThreadPool が COM オブジェクトをサポートしていないことを読んでいました。さらに、Page.RegisterAsyncTask も ThreadPool を使用していると思います。
Q4) どのような実装/アーキテクチャをアドバイスしてくれますか?
Q5) OnPreRender メソッドで Page.RegisterAsyncTask を使用する場合、メソッドで RenderContents がすべてのタスクが終了したときにのみ呼び出されると確信していますか?
スレッドで実装してみましたが、うまくいかないようです。SpSite にアクセスしようとするとすぐに、次の例外が発生します。
Microsoft.SharePoint.SPGlobal.HandleComException (COMException comEx) で Microsoft.SharePoint.Library.SPRequest.GetTokenOfCurrentUser (ブール値の bWindowsMode、文字列 bstrLogin、文字列 bstrUserKey、文字列 bstrRoles、UInt32 ulRoleCount) で Microsoft.SharePoint.SPSite.InitUserToken (SPRequest 要求) Microsoft.SharePoint.SPSite.SPSiteConstructor (SPFarm ファーム、Guid applicationId、Guid contentDatabaseId、Guid siteId、Guid siteSubscriptionId、SPUrlZone ゾーン、Uri requestUri、文字列 serverRelativeUrl、ブール値の hostHeaderIsSiteName、SPUserToken userToken) で Microsoft.SharePoint.SPSite..ctor (SPFarm farm、Uri requestUri、ブール値 contextSite、SPUserToken userToken) (Microsoft.SharePoint.SPSite..ctor(String requestUrl))
Page.RegisterAsyncTask で実装を試みましたが、次の例外が発生しています。
シングル スレッド モードで複数のスレッドを呼び出そうとしました。(HRESULT からの例外: 0x80010102 (RPC_E_ATTEMPTED_MULTITHREAD)) Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx) で Microsoft.SharePoint.Library.SPRequest.SetIPAddr(String bstrIPAddr) で Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite サイト、文字列名) 、Boolean bNotGlobalAdminCode、String strUrl、Boolean bNotAddToContext、Byte[] UserToken、String userName、Boolean bIgnoreTokenTimeout、Boolean bAsAnonymous) Microsoft.SharePoint.SPWeb.InitializeSPRequest() at Microsoft.SharePoint.SPWeb.GetList(String strUrl)
このようなアーキテクチャを実装するにはどうすればよいですか?
敬具