C# SqlConnection超时异常

C# SqlConnection超时异常,c#,wpf,timeout,async-await,sqlconnection,C#,Wpf,Timeout,Async Await,Sqlconnection,我遇到了一个奇怪的问题,即连接尝试的剩余超时似乎在多次尝试中持续存在 我有一个简单的窗口,其中输入连接信息,带有连接和取消按钮 当用户点击connect时,执行以下代码: DisableControls(); if((bool)AutoAuthenticated.IsChecked) { ((MainWindow)Owner).myConnection = new System.Data.SqlClient.SqlConnection

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

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

当用户点击connect时,执行以下代码:

 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对象,但我认为每次点击connect时将其设置为新的SqlConnection应该已经这样做了?

我发现了我缺少的东西。即使在关闭连接、处理对象、将其保存在using语句中时,问题仍然存在,因为还有另一个我不知道的元素——连接池

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

还有更多信息,但如果这有助于其他人解决类似问题,请在关闭连接时调用
ClearPool()
函数:

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


显然,从资源使用的角度来看,最好只在不需要重用连接的情况下调用该函数,但也就是说,我仍然需要仔细阅读,所以不要相信我的话

这与异步等待无关,对吗?如果调用SqlConnection.Open()而不是SqlConnection.OpenAsyc,则会发生同样的情况,对吗?您是否知道使用该连接字符串构建代码创建了多少字符串?仅仅使用或将是一个巨大的好处,但是,由于您专门构建了一个SQL连接字符串,所以我使用了
OpenAsync()
,这样应用程序在尝试连接时就不会锁定。我刚刚进行了测试,如果我只使用
Open()
,同样的情况也会发生。另外,当你说“你知道你正在创建多少字符串”时,我不确定你说的话会有什么帮助。传入的参数可能会更改,因此无论我如何执行,每次调用此函数时,我都会重新生成字符串。这似乎是在多线程应用程序(如web应用程序)中,仅调用.ClearPool()可能会重置池中仍在其他线程中活动/使用的任何连接。也许最好将打开连接作为一个同步操作,并将等待放在更高的抽象级别上。它只是把任务分成更大的一部分,但我仍然希望以一种不妨碍用户界面的方式来完成它。当我禁用控件时,用户无论如何都不能同时打开多个连接。等待发生在一个事件中(点击连接按钮),所以我不确定我能做到多高?另外,我怎么能同时使用Sqlconnection对象进行其他连接呢?我想我只能对一个…sql连接使用一个Sqlconnection,如果我一次想要多个连接,我需要多个Sqlconnection对象。我对
ClearPool()
的调用应该只会影响我传递给它的Sqlconnection对象,不是吗?我没有调用
ClearAllPools()
System.Data.SqlClient.SqlConnection.ClearPool(((MainWindow)Owner).myConnection);