4

我加载了一个具有 aprox 的数据表。60.000 行。

我循环这些,然后像这样写它们来构建一个文件:

                HttpContext.Current.Response.Write(lineItem);
                HttpContext.Current.Response.Write(Environment.NewLine);

当我迭代 ~15-25.000 行时,它会在 5 秒内工作,并且文件会完美生成。但是,似乎有一个限制,它突然需要很长时间然后超时(?)。

我得到错误:

System.Threading.ThreadAbortException:线程被中止。
在 System.AppDomain.GetId() 在 System.Threading.Thread.get_CurrentCulture() 在 System.String.IndexOf(String value) 在 Modules.DownloadReports.RemoveTags(String s) 在 Modules.DownloadReports.WriteProductData(DataTable products)

我在 web.config 中的超时时间是 3600 秒,适用于应用程序和 SQL 调用。

我的代码:

private void WriteProductData(DataTable products)
        {
            StringBuilder bld = new StringBuilder();
            try
            {
                //Column names
                const string str = "OrderId; ProductId; ProductName; SeriesName; BrandName; PrimaryCategory; Content; ContentUnit; Quantity; ListPrice; PlacedPrice; Status";
                bld.AppendLine(str);
                bld.AppendLine(Environment.NewLine);

                //Data
                string trackingNumber, productId, productName, seriesName, brandName, prodCategory, content, contentUnit, quantity, listPriceUnit, placedPriceUnit, status;
                string lineItem;
                string errorString = string.Empty;

                foreach (DataRow product in products.Rows)
                {
                  // initialize all the different strings

                  lineItem = string.Format("{0};{1};{2};{3};{4};{5};{6};{7};{8};{9};{10};{11};",
                                                trackingNumber, productId, productName, seriesName, brandName,
                                                prodCategory, content, contentUnit, quantity, listPriceUnit,
                                                placedPriceUnit, status);
                    //bld.AppendLine(lineItem);
                    //bld.AppendLine(Environment.NewLine);
                    HttpContext.Current.Response.Write(lineItem);
                    HttpContext.Current.Response.Write(Environment.NewLine);
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat(ex, "An exception occured during writing of product data to BI report");
                throw;
            }
            finally
            {
                //Response.Write(bld.ToString());
            }
        }

我试过什么...

我已经尽可能地优化了循环,所以唯一剩下的就是构建一个字符串,通过 string.format 连接。

我也尝试过使用 Stringbuilder 来构建大字符串,然后在最后写出来。

所以我的问题是...

  • 为什么我什至会得到 Thras 被中止异常?它需要大约 75 秒才能给我错误,而不是 5 分钟
  • ~15-25.000 行需要 5 秒,所以我的逻辑说 60.000 应该最多需要 15 秒。这里有什么问题?

更新:

我通过消除长时间操作的原因解决了这个问题。有一个字符串操作非常慢。当它被调用 3 次 pr row 时,它让一切都变得非常慢。

但是,这不是问题的根源。这只是一个实用的修复方法,直到数据负载非常大。

4

1 回答 1

0

尝试在 Web 配置中添加 maxRequestLength="1048576" 这也可能导致您遇到错误。

于 2012-11-16T10:21:48.680 回答