private IDbConnection GetConnection() { while(true) { PooledConnection conn = null; int idx; lock(this._Connections) { idx = this.FindPool(); if(idx >= 0) { conn = this._Connections[idx]; if(conn != null) { // reuse conn.Wait(); if(conn.State == ConnectionState.Open) { return conn; } else { continue; } } else { // new conn = new PooledConnection(this._Factory.CreateConnection()); conn.ConnectionString = this._ConnectionString; conn.Open(); this._Connections[idx] = conn; conn.Wait(); return conn; } } } if(idx < 0) { // wait WaitHandle.WaitAny(this._Connections.Where(c => c != null).Select(c => c.WaitHandle).ToArray()); } } }