我加载了一个具有 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 时,它让一切都变得非常慢。
但是,这不是问题的根源。这只是一个实用的修复方法,直到数据负载非常大。