代码如下span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000fffor/span (span stylecolor:#0000ffint/span i 0; i 10000; i) { SqlConnection conn span stylecolor:#0000ffnew/span SqlConnection(span stylecolor:#006080Data Source.\SQLEXPRESS; AttachDbFilename/spanspan stylecolor:#006080E:\DB\NORTHWND.mdf/spanspan stylecolor:#006080; Integrated SecurityTrue;Connect Timeout30;User InstanceTrue/span); conn.Open(); Console.WriteLine(span stylecolor:#006080打开了{0}个连接/span, i); }/span/span运行结果如下过一会就会提示打开连接超时了可以看到数据库连接时有限制的如果连接不关闭而且使用的人比较多那么系统很快就down掉了。但是有时候由于某些原因应用程序可能只是几个人使用所以就有人设计了在应用程序启动的时候打开数据库连接在应用程序关闭的时候关闭数据库连接那么使用这种方式有什么问题呢首先假设有一张表Nums表定义如下Main代码如下span stylecolor:#000000span stylebackground-color:#ffffffSqlConnection conn span stylecolor:#0000ffnew/span SqlConnection(span stylecolor:#006080Data Source.\SQLEXPRESS; AttachDbFilename/spanspan stylecolor:#006080E:\DB\NORTHWND.mdf/spanspan stylecolor:#006080; Integrated SecurityTrue;Connect Timeout30;User InstanceTrue/span); conn.Open(); Parallel.For(1, 9999, (id) { ExecuteCommand(conn, id); });/span/spanspan stylecolor:#000000span stylebackground-color:#ffffff /span/span就是从1到9999开始执行ExecuteCommandExecuteCommand代码如下span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffprivate/span span stylecolor:#0000ffstatic/span span stylecolor:#0000ffvoid/span ExecuteCommand(SqlConnection conn, span stylecolor:#0000ffint/span id) { Console.WriteLine(span stylecolor:#006080正在执行./span id); Thread.Sleep(100); SqlCommand cmd span stylecolor:#0000ffnew/span SqlCommand( span stylecolor:#0000ffstring/span.Format(span stylecolor:#006080Insert into Nums values({0}) /span, id), conn); cmd.ExecuteNonQuery(); }/span/span运行可以看到ExecuteNonQuery方法抛出了异常原因是连接处于关闭状态。可是我们的连接一直都是open着的啊并没有调用closedispose之类的方法啊。于是在ExecuteCommand前面增加判断条件span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#0000ffif/span (conn.State ! System.Data.ConnectionState.Open) conn.Open();/span/span再次运行可以看到还是会出现连接已关闭的问题。你知道什么原因吗这里是由于多线程环境引起的。所以需要加锁。privatestaticobjectsyncObj newobject();privatestaticvoidExecuteCommand(SqlConnection conn,intid){lock(syncObj){if(conn.State ! System.Data.ConnectionState.Open)conn.Open();Console.WriteLine(正在执行.. id);Thread.Sleep(100);SqlCommand cmd newSqlCommand(string.Format(Insert into Nums values({0}), id), conn);cmd.ExecuteNonQuery();}}再次运行可以发现基本没问题了.修改Parallel.For的最大值上限要测试下是否可以长期执行了。Parallel.For(1, Int32.MaxValue, (id) {ExecuteCommand(conn, id);});