parallel.for循环给出超时异常

时间:2015-06-01 03:54:38

标签: c# .net

我正在使用Parallel.For进行并发调用。

 SqlConnection connection = new SqlConnection(connectionString);                          
 connection.Open();
 SqlCommand cmd = new SqlCommand();
 //SqlDataReader reader;                            
 cmd.CommandType = CommandType.Text;
 cmd.Connection = connection;
 Parallel.For(0, 100, delegate(int i)
 {
  //insert into database;
  cmd.CommandText = string.Format("insert into Service_LoadTest(id,ServiceCallcount) values ({0},'Call_{1}')", i, i);                               
  cmd.ExecuteNonQuery();
  });

在插入一些计数到70之后,我收到超时异常,因为“超时已到期。超时时间已经过去,操作完成或服务器没有响应。”。我已经设置了连接字符串超时属性,但是没运气。请帮忙。

2 个答案:

答案 0 :(得分:2)

您的代码不是线程安全的。尝试将所有代码移动到循环中:

Parallel.For(0, 100, delegate(int i)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {                          
        connection.Open();

        SqlCommand cmd = new SqlCommand();

        cmd.CommandType = CommandType.Text;
        cmd.Connection = connection;

        cmd.CommandText = string.Format("insert into Service_LoadTest(id,ServiceCallcount) values ({0},'Call_{1}')", i, i);                               
        cmd.ExecuteNonQuery();
    }
});

答案 1 :(得分:0)

不是每次都创建SqlConnection和SqlCommand对象,而是为每个查询单独调用ExecuteNonQuery,你应该连接所有查询,并且只为该连接查询调用一次ExecuteNonQuery。

为了实现上述功能,只需在CommandText中附加由';'分隔的所有查询。然后调用ExecuteNonQuery。