平行的.For循环给出超时异常

本文关键字:超时 异常 循环 For | 更新日期: 2023-09-27 17:51:15

我使用Parallel。用于进行以下并发呼叫。

 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后,我得到超时异常为"超时过期"。在操作完成之前的超时时间或服务器没有响应。我已经设置了连接字符串超时属性,但没有运气。请帮助。

平行的.For循环给出超时异常

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

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();
    }
});

不要每次都创建SqlConnection和SqlCommand对象,并将它们初始化以分别为每个查询调用ExecuteNonQuery,您应该将所有查询连接起来,并仅为该连接的查询调用ExecuteNonQuery一次。

要实现以上,只需在CommandText中附加以';'分隔的所有查询,然后调用ExecuteNonQuery。