我遇到了一个奇怪的问题,即连接尝试的超时时间似乎持续多次尝试。
我有一个输入连接信息的简单窗口,带有连接和取消按钮。
当用户点击连接时,执行以下代码:
DisableControls();
if((bool)AutoAuthenticated.IsChecked)
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("server="+ServerName.Text + ";"+
"Trusted_Connection=yes;" +
"database="+DatabaseName.Text + ";" +
"connection timeout=3");
}
else
{
((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection
("user id="+UserName.Text+";" +
"password="+Password.Password+";" +
"server="+ServerName.Text+";" +
"Trusted_Connection=no;" +
"database="+DatabaseName.Text+";" +
"connection timeout=3");
}
await ConnectToServer();
这是ConnectToServer功能:
private async Task ConnectToServer()
{
//using (((MainWindow)Owner).myConnection)
//{
await ((MainWindow)Owner).myConnection.OpenAsync();
//}
}
现在,为了测试,timeout属性很小。
无论如何,如果用户在连接时点击取消按钮:
private void Cancel_Click(object sender, RoutedEventArgs e)
{
if (((MainWindow)Owner).myConnection != null &&
((MainWindow)Owner).myConnection.State ==
System.Data.ConnectionState.Connecting)
{
((MainWindow)Owner).myConnection.Close();
EnableControls();
}
else
{
this.Close();
}
}
现在,如果我输入伪造的详细信息并将其保留为超时,那么我会抓住“未找到网络路径”的异常。
如果我在此之后尝试再次连接(或者可能是下一次尝试之后的连接,取决于我点击取消按钮的速度有多快),它在点击连接按钮后几乎立即超时,无需等待时间它应该是。
我不确定我在这里做错了什么,我已经尝试重置SqlConnection对象了,但我想每次点击连接时将它设置为新的SqlConnection应该已经这样做了吗?
答案 0 :(得分:1)
我发现了我所缺少的东西。即使关闭连接,处理对象,将其全部保存在using语句中,问题仍然存在,因为还有另一个我不知道的元素 - 连接池。
我仍然需要对此进行一些阅读,但基本上它会重复使用旧的连接信息等,以节省资源等。
有更多信息here,但如果这有助于其他有类似问题的人,请在关闭连接时调用ClearPool()
函数:
示例(在我的异常处理代码中,在我调用Close()之后):
System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);
显然从资源使用的角度来看,最好只在你不需要重用连接时调用该函数,但是说,我仍然需要阅读这个,所以不要理我的话为它!