2

我遇到了一个奇怪的问题,即连接尝试的剩余超时似乎通过多次尝试持续存在。

我有一个输入连接信息的简单窗口,带有连接和取消按钮。

当用户点击连接时,将执行以下代码:

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

出于测试目的,超时属性现在很小。

无论如何,如果用户在连接时点击取消按钮:

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 应该已经这样做了吗?

4

1 回答 1

1

我发现我错过了什么。即使关闭连接、处理对象、将其全部保存在 using 语句中,问题仍然存在,因为还有另一个我不知道的元素 - 连接池。

我仍然需要对此进行一些阅读,但基本上它会重用旧的连接信息等以节省资源等。

这里有更多信息,但如果这有助于其他有类似问题的人,只需ClearPool()在关闭连接时调用该函数:

示例(在我的异常处理代码中,在我调用 Close() 之后):

System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);

显然,从资源使用的角度来看,最好仅在不需要重用连接时才调用该函数,但也就是说,我仍然需要阅读此内容,所以不要相信我的话!

于 2013-06-07T13:18:45.800 回答