我加载了一个具有aprox的数据表。60.000行。
我循环这些,然后像这样写它们来构建一个文件:
HttpContext.Current.Response.Write(lineItem);
HttpContext.Current.Response.Write(Environment.NewLine);
当我迭代大约15-2500行时,它在5秒内就可以工作了,文件就完美地生成了。然而,似乎有一个极限,它突然需要很长时间,然后超时(?)。
我得到错误:
系统。线程。ThreadAbortException:线程被中止
在系统中。AppDomain。GetId()位于系统线程。位于的线程.get_CurrentCulture()系统一串IndexOf(字符串值)位于模块。下载报告。RemoveTags(字符串s) 在模块。下载报告。WriteProductData(数据表产品)
web.config中应用程序和SQL调用的超时时间均为3600秒。
我的代码:
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来构建大字符串,然后在最后写出它。
所以我的问题是。。。
- 为什么我甚至得到线程被中止异常?它花了大约75秒才给我错误,而不是5分钟
- ~15-25000行需要5秒,所以我的逻辑是60.000行最多需要15秒。这里可能出了什么问题
更新:
我通过消除长时间手术的原因解决了这个问题。有一个字符串操作很慢。。当它被称为三次公关时,一切都变得非常缓慢。
然而,这并不是问题的根源。。这只是一个务实的解决方案,它会起作用,直到数据负载非常大。
尝试在web配置中添加maxRequestLength="1048576",这也可能导致出现错误。