[英]Async ADO.NET or TaskFactory
我有4個沉重的數據庫表(每個表有3000萬行),我的查詢從所有4個表中獲取數據,並進行合並以合並所有表,並且查詢沒有返回很多行(最多1000行)。 因此,假設整個查詢需要20秒才能完成,我想為每個表編寫一個單獨的查詢,並使用async或TPL對其進行調用,然后將結果合並到我的業務對象(c#.Net 4.0)中,然后返回到ASP.NET Web表單。
我看過BeginExecuteReader和Task.Factory.StartNew,但是我不確定如何將所有內容放在一起,以前有人做過這樣的事情嗎? 知道我該怎么做嗎?
我終於親自完成了此操作,並在其他人需要時將其放在此處。
DataTable dtReturn = new DataTable();
var connection = new SqlConnection((_connectionstring.IndexOf("MultipleActiveResultsets") == -1) ? _connectionstring + "MultipleActiveResultsets=True;" : _connectionstring);
try
{
connection.Open();
Task<DataTable>[] tasks = new Task<DataTable>[source.Rows.Count];
for (int i = 0; i < source.Rows.Count; i++)
{
int s = Convert.ToInt32(source.Rows[i][0]);
Task<DataTable> t = Task.Factory.StartNew(() =>
{
var command = connection.CreateCommand();
command.CommandText = commandText;
command.CommandType = CommandType.StoredProcedure;
command.CommandTimeout = timeout;
foreach (SqlParameter p in parms)
{
if (p.ParameterName == "@Sources")
command.Parameters.Add(new SqlParameter() { SqlDbType = System.Data.SqlDbType.Structured, ParameterName = p.ParameterName, Value = s.ToString().ToIDList() });
else
command.Parameters.Add(new SqlParameter() { ParameterName = p.ParameterName, Value = p.Value });
}
var dr = command.ExecuteReader();
command.Parameters.Clear();
DataTable dt = new DataTable();
if (dr.HasRows)
{
dt.Load(dr);
dr.Close();
}
return dt;
});
tasks[i] = t;
}
Task.WaitAll(tasks);
if (tasks.Length > 0)
{
bool isSchemaCloned = false;
foreach (var t in tasks)
{
if (!isSchemaCloned && t.Result.Columns.Count > 0 )
{
dtReturn = t.Result.Clone();
isSchemaCloned = true;
}
foreach (DataRow r in t.Result.Rows)
{
dtReturn.Rows.Add(r.ItemArray);
}
}
}
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (connection.State != ConnectionState.Closed)
connection.Close();
}
return dtReturn;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.