我想在一個線程/並行地執行多次有兩個輸入參數(比如100次)的SP。我添加了異步處理= True; MultipleActiveResultSets =在我的連接字符串真實,使用下面的代碼來執行SP通過C#在線程上使用不同的輸入參數執行SQL Server存儲過程?
在button_Click
// ExecuteSPList是具有100 ReportID和按鈕點擊我創建線程100次被調用的名單列表CallInvokeUpdate
Parallel.ForEach(ExecuteSPList, itm =>
{
CallInvokeUpdate(itm.ToString());
});
然後在CallInvoke:
public void CallInvokeUpdate(string str)
{
ExecuteSP(str, strSelectedMonthEndDate);
}
最後ExecuteSP方法。
public string ExecuteSP(string ReportId)
{
try
{
string connectionString = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
DataSet ds = new DataSet();
using (SqlConnection sqlConnection = new SqlConnection(connectionString))
{
SqlCommand cmd = new SqlCommand("UpdateExecuteSP", sqlConnection);
sqlConnection.Open();
cmd.CommandTimeout = 3000000;
addParameter(cmd, "ReportId", ReportId, SqlDbType.Int);
cmd.CommandType = CommandType.StoredProcedure;
IAsyncResult result = cmd.BeginExecuteNonQuery();
cmd.EndExecuteNonQuery(result);
}
return "OK";
}
catch (Exception ex)
{
throw;
}
}
private void addParameter(SqlCommand cmd, string name, object value, SqlDbType type)
{
SqlParameter parameter = new SqlParameter(name, type);
cmd.Parameters.Add(parameter);
parameter.Value = value;
}
我的問題是,如果存儲過程「UpdateExecuteSP」的執行需要5秒爲一個 ReportId然後使用這種方法也正在採取某處大約100 * 5 = 500秒。
任何人都可以建議如何減少這段時間並平行運行SP100次。任何執行之間沒有依賴關係。
有什麼建議嗎?
我會作出存儲過程中您的DB調用靜態方法開始。然後管理 –
的多線程,最可能的兩個原因是:SP鎖定表並且不能並行運行,或者您正在限制硬盤驅動器IO。 – Tsabo
@Tsabo我在執行SP之後發現它鎖定了DB中的表。這是否意味着,直到鎖定沒有釋放下一個處理將不會發生。請注意,受SP參數影響的記錄與param2,param3等完全不同。請建議。 – user2519971