0

私は現在、部分的なビューをレンダリングし、結果を ConcurrentBag に追加する簡単なコードを実行しています。

Threading.Tasks.Parallel.For(0, Model.Count,
                                Sub(i)
                                    carXmls.Add(Html.Partial("PublisherVehicleXml16", Model(i)))
                                End Sub)

悲しいことに、時々、次の例外が発生してクラッシュすることがあります。Stack empty.

これは断続的に発生し、ステージングおよび本番環境でのみ発生します。これはどこから来ているのでしょうか?

編集: carsXmlsは次のように宣言されています:

   Dim carXmls As New Collections.Concurrent.ConcurrentBag(Of MvcHtmlString)

完全な例外は次のとおりです。

メッセージスタックが空です。

ソースシステム

対象サイトT Pop()

System.Collections.Generic.Stack 1 継続でのスタック トレース1.Pop() at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.b__19() at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func) System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) で System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String)アクション名)

4

1 に答える 1

0

ASP.NET オブジェクトを使用している複数のスレッドでコードを実行しています。ASP.NET (MVC) は、これが安全であることを保証しません。ご覧のとおり、安全ではありません。

つまり、ASP.NET インフラストラクチャを同時に使用することはできません。

ASP.NET オブジェクトを使用せずに並列処理できるように、負荷の高い計算をすべて抽出することをお勧めします。その後、ビューを順番にレンダリングできます。

于 2012-07-30T10:16:24.180 に答える